1 1 1 1 1 1 1 1 1 1 Rating 5.00 (1 Vote)

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:

mtv 2
 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.

mtv 1

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
 
Im Load Ereignis des Forms wird die Variable gesetzt und im Entladen wieder gelöscht.
Private Sub Form_Load()
    Set objTreeView = Me!vbalColumnTreeView8.Object
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Set objTreeView = Nothing
End Sub
Danach kann dann auf die Intellisense-Funktion zugegriffen werden.
 
Alle Bsp-Codes beziehen sich auf die  Bsp-DB dieses Workshops
Kommen wir nun zum eigentlichen Füllen des Treeviews
Erstellen der Grundstruktur
Im Treeview werden 3 zusätzliche Spalten erstellt. (Hat nichts mit den Nodes zutun)
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
 
Diese Sub wird dann auch im Load-Ereignis des Forms aufgerufen.
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
 
Jetzt benötigen wir für jeden Node eine Prozedur
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
 
Diese werden dann in der eigentlichen Prozedur zum Füllen des Treeviews aufgerufen.
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.
 
 
1. Alle Nodes aus- bzw. einklappen
Dafür müssen alle Nodes durchlaufen werden.
mtv 7
 
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
 
Mit einem Doppelklick auf den jeweiligen Node wird dieser dann expandiert.
 
mtv 8
 
2. Im Treeview nach Einträgen suchen
Hier muss unterschieden werden ob man in den Nodes oder in den SubItems suchen möchte.
 
mtv 4


mtv 5
 
 
Nach dem Klick auf den Button "Suchen" werden die gefundenen Einträge rot hinterlegt.
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
 
3. Daten aus den Nodes oder den Subitems auslesen
Mit dem Klickereignis des Nodeobjects lassen sich beliebige Werte aus dem Treeview holen.
Hier zum Bsp. wollen wir den Text des jeweiligen Nodes und den Wert der unsichtbaren Spalte "Mit_ID" auslesen.
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
 
mtv 6


In der Bsp. DB ist dann noch eine Version zur Anzeige von MP3- Dateien drin.
Ich gehe darauf nicht weiter ein, dass kann jeder sich im Bsp. anschauen.


mtv 3


Grundlagen zum Auslesen von MP3-Tags finden Ihr hier: MP3 Tags lesen und bearbeiten
 
Dateien:
Bsp-DB zum Workshop zur Benutzung MultiColumnTreeview
Archiv enthält folgende Dateien:

tk_TreeView00_MP3.mdb

Für MS-Access ab A00
 

Download enthält nur die mdb-Datei für Access 2000
Datum 05.02.2018
Dateigröße 121.61 KB
Download 591


Bsp-DB zum Workshop zur Benutzung MultiColumnTreeview
Archiv enthält folgende Dateien:

tk_TreeView_MP3.mdb

Diese Dateien müssel mittels "regsvr32" manuell im System registriert werden!
vbalColumnTreeView6.ocx
vbalIml6.ocx
SSubTmr6.dll
AudioGenie3.dll

Für MS-Access ab A02-A10
Datum 05.02.2018
Dateigröße 394.69 KB
Download 653
 

Ähnliche Artikel

Kommentar schreiben

Sicherheitscode
Aktualisieren

Login Form

1.png1.png9.png3.png2.png6.png1.png
Heute77
Gestern57
Diese Woche190
Dieser Monat1320
Total1193261

  • IP: 54.80.183.100
  • Browser: Unknown
  • Version:
  • OS: Unknown

Online

1
Online

23. Mai 2018