Nur für 32Bit Office Versionen
Im letzten Workshop hatte ich gezeigt wie man SGrid2-Control von vbaccelerator unter MS-Access benutzen kann.
Aus der gleichen Sofwareschmiede stammt das Multi-Column TreeView Control.
Auch dieses Control lässt sich in MS-Access verwenden. Das möchte in diesem Workshop zeigen.
Das Multi-Column TreeView Control hat ggü. dem herkömmlichen Treeview ein paar zusätzliche Funktionen.
So ist es möglich Daten im Detailbereich in mehreren Spalten darzustellen.
Im Workshop werde ich zeigen wie sich z.B. eine Mitarbeiterzimmerbelegung grafisch darstellen lässt und
wie sich MP3-Dateien einlesen lassen, die MP3-Tags ausgelesen werden und das Ergebnis im Multi-Column TreeView Control dargestellt wird.
Das Ergebnis könnte dann so aussehen:
Grundlagen und Voraussetzungen:
Die Bsp-DB ist ab A00 lauffähig.
Im Download sind in dem Archiv alle benötigten Dateien enthalten.
Die Dateien "vbalColumnTreeView6.ocx ", "vbalIml6.ocx", "SSubTmr6.dll" und "Audiogenie3.dll" müssen manuell im System registriert werden.
MP3-Tags werden mit Hilfe der "Audiogenie3.dll" auslesen. Diese ist eine OpenSource DLL. Weitere Infos hier.
Weitere Infos für die Benutzung der "vbalIml6.ocx" bitte hier nachlesen.
Einfügen des Controls in ein Formular.
Formularentwurf
Menü -> Einfügen -> ActiveX-Steuerelement
In der Liste das Control auwählen (roter Rahmen) und OK klicken.
Code Grundeinstellungen
Eigentlich wird das Grid genau wie jedes andere Control im Code angesprochen.
Nun hat aber Access die Eigenart von externen Controls die Eigenschaften und Methoden nich per Intellisense anzuzeigen.Das kann aber auch realisiert werden.
Im Modulkopf deklarieren wie eine Variable:
Option Compare Database Option Explicit Dim objTreeView As vbalColumnTreeView
Private Sub Form_Load() Set objTreeView = Me!vbalColumnTreeView8.Object End Sub Private Sub Form_Unload(Cancel As Integer) Set objTreeView = Nothing End Sub
Die letzte Spalte erhält die Breite 0 (unsichtbar)
Private Sub setUpColumns() 'Spalten im TreeView erstellen Dim cCol As cCTreeViewColumn With objTreeView With .Columns .Item(1).Width = 200 Set cCol = .Add("VN", "Vorname") Set cCol = .Add("TEL", "Tel") Set cCol = .Add("ID", "MID") 'ID Spaltenbreite auf 0 setzen .Item(4).Width = 0 End With End With End Sub
Private Sub Form_Load() '************************************************* 'Objektvariablen für TreeView und ImageList intialisieren Set objTreeView = Me.vbalColumnTreeView8.Object objTreeView.ImageList = Me!vbalImageList9.hIml '************************************************* 'Spalten im TreeView erstellen setUpColumns objTreeView.GridLines = True 'Treeview mit Daten füllen FillColumn End Sub
In unserem Bsp. sind es die Nodes für die Abteilung und den Raum.
Private Function addAbt(ByVal sAbt As String) As cCTreeViewNode 'Abteilungen hinzufügen Set addAbt = objTreeView.Nodes.Add(, , sAbt, sAbt, 0, 0) End Function Private Function addRaum(cArtistNode As cCTreeViewNode, ByVal sRaum As String, _ ByVal sIndex As String) As cCTreeViewNode 'Räume hinzufügen Set addRaum = cArtistNode.AddChildNode(sIndex, sRaum, 1, 1) End Function
Private Sub FillColumn() Dim i As Long Dim nodAbt As cCTreeViewNode Dim nodRaum As cCTreeViewNode Dim nod As cCTreeViewNode Dim rs As DAO.Recordset On Error GoTo FillColumn_Error Set rs = CurrentDb.OpenRecordset("qry_Belegung") Do While Not rs.EOF 'Prüfen ob Abteilung schon vorhanden ist und bei Bedarf hinzufügen If objTreeView.Nodes.Exists(rs!Abteilung) = False Then Set nodAbt = addAbt(rs!Abteilung) Else Set nodAbt = objTreeView.Nodes.Item(rs!Abteilung) End If 'Prüfen ob Raum schon vorhanden ist und bei Bedarf hinzufügen 'Nachname, Vorname und TelNr hinzu fügen If objTreeView.Nodes.Exists(rs!Raum & rs!R_ID) = False Then Set nodRaum = addRaum(nodAbt, rs!Raum, rs!Raum & rs!R_ID) Set nod = nodRaum.AddChildNode(rs!Nachname & rs!Mit_ID, rs!Nachname, 2, 2) nod.SubItem(1).Text = rs!Vorname nod.SubItem(2).Text = rs!Telefon nod.SubItem(3).Text = rs!Mit_ID Else Set nodRaum = objTreeView.Nodes.Item(rs!Raum & rs!R_ID) Set nod = nodRaum.AddChildNode(rs!Nachname & rs!Mit_ID, rs!Nachname, 2, 2) nod.SubItem(1).Text = rs!Vorname nod.SubItem(2).Text = rs!Telefon nod.SubItem(3).Text = rs!Mit_ID End If 'Alle Knoten expandieren nodAbt.Expanded = True nodRaum.Expanded = True rs.MoveNext Loop rs.Close On Error GoTo 0 Exit Sub FillColumn_Error: Resume Next End Sub
Jetzt wäre das Treeview gefüllt und wir kommem noch zu einigen zusätzlichen Funktionen.
Private Sub cmd_Collapse_Click() 'Alle Nodes einklappen Dim i As Integer, oNode As Object Me.vbalColumnTreeView8.SetFocus For i = 1 To objTreeView.NodeCount Set oNode = objTreeView.Nodes(i) oNode.Expanded = False Next i End Sub Private Sub cmd_Expand_Click() 'Alle Nodes ausklappen Dim i As Integer, oNode As Object Me.vbalColumnTreeView8.SetFocus For i = 1 To objTreeView.NodeCount Set oNode = objTreeView.Nodes(i) oNode.Expanded = True Next i End Sub
Um die Markierung zu löschen ist den Eintrag im Suchfeld zu löschen und der Button zu klicken.
Private Sub cmd_Search_Click() Dim i As Integer, oNode As Object Dim sString As String If IsNull(Me.txt_Search) Or Me.txt_Search = "" Then Me.vbalColumnTreeView8.SetFocus For i = 1 To objTreeView.NodeCount Set oNode = objTreeView.Nodes(i) objTreeView.Nodes(oNode.Key).BackColor = vbWhite objTreeView.Nodes(oNode.Key).Selected = False Next i Else sString = Me.txt_Search Me.vbalColumnTreeView8.SetFocus 'Suche in den Nodes If Me.fra_Opt = 1 Then For i = 1 To objTreeView.NodeCount Set oNode = objTreeView.Nodes(i) If InStr(1, oNode.Text, sString) > 0 Then objTreeView.Nodes(oNode.Key).BackColor = 255 Else objTreeView.Nodes(oNode.Key).BackColor = vbWhite End If objTreeView.Nodes(oNode.Key).Selected = False Next i Else 'Suche in den SubItems, hier in der Telefonspalte (SubItem(2)) 'Kann mit einer Schleife über alle SubItems erweitert werden For i = 1 To objTreeView.NodeCount Set oNode = objTreeView.Nodes(i) If InStr(1, oNode.SubItem(2).Text, sString) > 0 Then objTreeView.Nodes(oNode.Key).BackColor = 255 Else objTreeView.Nodes(oNode.Key).BackColor = vbWhite End If objTreeView.Nodes(oNode.Key).Selected = False Next i End If End If Me.txt_Search.SetFocus End Sub
Private Sub vbalColumnTreeView8_NodeClick(node As Object) 'Text der genannte Spalte auslesen 'des Nodes Me.txt_Node = node.Text 'des Subitems Me.txt_ID = node.SubItem(3).Text End Sub
Für MS-Access ab A00
Download enthält nur die mdb-Datei für Access 2000
Diese Dateien müssel mittels "regsvr32" manuell im System registriert werden!
Für MS-Access ab A02-A10
Ähnliche Artikel
Kommentare
danke für Dein Feedback. Schön das Dir Workshop weiter hilft.
perfekter Workshop, toll und umfassend erläutert. Jetzt nutze ich diese Controls auch.
Alle Kommentare dieses Beitrages als RSS-Feed.