vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · TreeView   |   VB-Versionen: VB623.09.02
TreeView-Inhalt speichern und einlesen

Eine Universalroutine, mit der sich der Inhalt eines TreeView-Controls mit allem Drum und Dran speichern und laden lässt.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  31.790 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Wie man den Inhalt einer ListBox oder einem ListView-Control speicherst bzw. wieder einliest haben wir Ihnen bereits vor längerer Zeit gezeigt.

Wie sieht es aber mit dem TreeView-Control aus?

Einfach nur die Einträge hintereinander in eine Textdatei speichern und wieder einlesen funktioniert hier nicht korrekt, da es sich meist nicht nur um Parentnodes (Eltern-Objekte) handelt, sondern um verschachelte Node-Strukturen.

Im nachfolgenden finden Sie ein Beispielcode, mit dem sich der Inhalt eines TreeViews mit allem Drum und Dran speichern und auch wieder restaurieren lässt. Hierbei werden nicht nur die Einträge und deren Verchachtelungen gespeichert, sondern auch alle Eigenschaften der einzelnen Node-Objekte, wie Image (Symbol), Bold (Fett), Checked (markiert) usw.

TreeView-Inhalt speichern

' TreeView-Inhalt speichern
Public Sub tvw_Save(tvw As TreeView, ByVal sFile As String)
  Dim F As Integer
  Dim oNode As Node
  Dim NodeX As Node
 
  F = FreeFile
  Open sFile For Output As #F
 
  ' Alle Einträge speichern
  Set oNode = tvw.Nodes(1)
  Do
    tvw_SaveItems F, oNode
    Set oNode = oNode.Next
  Loop Until oNode Is Nothing
  Close #F
End Sub
' TreeView-Einträge speichern
' 
' ACHTUNG! Diese Prozedur wird rekursiv für jeden
' Zweig aufgerufen!
' 
Private Sub tvw_SaveItems(ByVal F As Integer, ByVal oNode As Node)
  Dim nIndent As Integer
  Dim sPath As String
  Dim sItem() As String
  Dim NodeX As Node
 
  With oNode
    sPath = .FullPath
    sItem = Split(sPath, "\")
    nIndent = UBound(sItem)
 
    ' Parent-Node
    Print #F, tvw_SaveSetData(nIndent, oNode)
 
    ' Jetzt alle direkten Child-Nodes
    If oNode.Children > 0 Then
      Set NodeX = oNode.Child
      Do
        With NodeX
          If NodeX.Children > 0 Then
            ' Prozedur rekursiv mit neuem Zweig aufrufen
            tvw_SaveItems F, NodeX
          Else
            ' Eintrag speichern
            Print #F, tvw_SaveSetData(nIndent + 1, NodeX)
          End If
        End With
        Set NodeX = NodeX.Next
      Loop Until NodeX Is Nothing
    End If
  End With
End Sub
' Alle Infos eines Eintrags zusammenfassen
Private Function tvw_SaveSetData(ByVal nIndent As Integer, _
  oNode As Node) As String
 
  With oNode
    tvw_SaveSetData = String$(nIndent, ".") + vbTab + _
      .Key + vbTab + .Text + vbTab + _
      CStr(.Image) + vbTab + CStr(.SelectedImage) + vbTab + _
      CStr(.ForeColor) + vbTab + CStr(.BackColor) + vbTab + _
      CStr(.Bold) + vbTab + .Tag + vbTab + _
      CStr(.Checked) + vbTab + CStr(.Expanded) + vbTab + _
      CStr(.Sorted)
  End With
End Function

TreeView-Inhalt aus Datei einlesen

' TreeView-Einträge aus Datei einlesen
Public Sub tvw_Load(tvw As TreeView, ByVal sFile As String)
  Dim F As Integer
  Dim sLine As String
  Dim sData() As String
  Dim nIndent As Integer
  Dim sKey As String
  Dim sText As String
  Dim nImg As Integer
  Dim nImgSel As Integer
  Dim nForeColor As Long
  Dim nBackColor As Long
  Dim bBold As Boolean
  Dim sTag As String
  Dim bChecked As Boolean
  Dim bExpanded As Boolean
  Dim bSorted As Boolean
  Dim oNode As Node
  Dim NodeX As Node
  Dim nLastIndent As Integer
 
  ' Existiert die Datei?
  If Dir$(sFile, vbNormal) <> "" Then
    With tvw
      ' Treeview löschen
      .Nodes.Clear
 
      ' Darstellung abschalten
      .Visible = False
      DoEvents
 
      ' Datei zum Lesen öffnen
      F = FreeFile
      Open sFile For Input As #F
 
      ' Alle Einträge nacheinander einlesen
      nLastIndent = 0
      While Not EOF(F)
        Line Input #F, sLine
        sData = Split(sLine, vbTab)
 
        ' Zeile in Einzel-Informationen zerlegen
        nIndent = Len(sData(0))
        sKey = sData(1)
        sText = sData(2)
        nImg = Val(sData(3))
        nImgSel = Val(sData(4))
        nForeColor = Val(sData(5))
        nBackColor = Val(sData(6))
        bBold = CBool(sData(7))
        sTag = sData(8)
        bChecked = CBool(sData(9))
        bExpanded = CBool(sData(10))
        bSorted = CBool(sData(11))
 
        If nIndent = 0 Then
          ' Root
          Set oNode = .Nodes.Add(, , sKey, sText, nImg, nImgSel)
          tvw_LoadSetData oNode, nForeColor, nBackColor, _
            bBold, bChecked, sTag, bExpanded, bSorted
        Else
          ' Parent ermitteln
          If nIndent < nLastIndent Then
            While nIndent < nLastIndent
              Set oNode = oNode.Parent
              nLastIndent = nLastIndent - 1
            Wend
          ElseIf nIndent > nLastIndent And nIndent > 1 Then
            Set oNode = NodeX
          End If
 
          ' Eintrag hinzufügen
          Set NodeX = .Nodes.Add(oNode, tvwChild, _
            sKey, sText, nImg, nImgSel)
          tvw_LoadSetData NodeX, nForeColor, nBackColor, _
            bBold, bChecked, sTag, bExpanded, bSorted
        End If
 
        nLastIndent = nIndent
      Wend
 
      ' Darstellung wieder einschalten
      .Visible = True
 
    End With
    Close #F
  End If
End Sub
' Setze alle gespeicherten Eigenschaften eines
' einzelnen TreeView-Eintrages
Private Sub tvw_LoadSetData(oNode As Node, _
  ByVal nForeColor As Long, ByVal nBackColor As Long, _
  ByVal bBold As Boolean, ByVal bChecked As Boolean, _
  ByVal sTag As String, ByVal bExpanded As Boolean, _
  ByVal bSorted As Boolean)
 
  With oNode
    .ForeColor = nForeColor
    .BackColor = nBackColor
    .Bold = bBold
    .Checked = bChecked
    .Tag = sTag
    .Expanded = bExpanded
    .Sorted = bSorted
  End With
End Sub

Aufruf der Funktionen

Um den Inhalt des TreeView-Inhaltes zu speichern, genügt folgender Aufruf:

tvw_Save TreeView1, App.Path & "\myTreeView.dat"

Um den gespeicherten Inhalt wieder einzulesen, folgender Aufruf:

tvw_Load TreeView1, App.Path & "\myTreeView.dat"

Dieser Tipp wurde bereits 31.790 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel