vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Dateisystem · Ordner & Verzeichnisse   |   VB-Versionen: VB4, VB5, VB624.04.03
Ordner im TreeView à la Explorer

Alle Ordner eines Verzeichnisses im TreeView darstellen. Um die Perfomance zu steigern, werden jedoch nur die Ordner geladen, die man auch tatsächlich sehen kann!

Autor:   Hermann KlinkeBewertung:     [ Jetzt bewerten ]Views:  24.491 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

In einem unserer früheren Tipps ( Folder-TreeView im Eigenbau) wurde gezeigt, wie man ein TreeView-Steuerelement mit einem Mal mit allen Unterordner eines Verzeichnisses füllt. Diese Methode war sehr langsam. Zudem musste man, um das Verzeichnis zu aktualisieren, alles komplett neu laden.

Deshalb wurde dort schon aufgerufen, eine Methode zu entwickeln, um nur die Ornder zu laden, die man sehen konnte (und natürlich auch die Unterornder, da ja sonst das schöne "+" zu expandieren des Ordners fehlen würde).

Naja genug geredet Im nachfolgenden lernen Sie eine Methode kennen, die extrem schneller und flexibler ist, ja fast schon so schnell wie der Microsoft Explorer!

Hier die einzelnen Funktionen mit kurzen Beschreibungen:

  • als sDirectory übergibt man das Verzeichnis das geladen werden soll
  • als sImage übergibt man den Key des Bildes (am besten ein Ordner) einer ImageList
  • sExpandedImage verhält sich wie oben und legt den Key für das Bild eines geöffneten Ordners fest

Fügen Sie nachfolgenden Code in ein Modul ein:

Option Explicit
 
' Diese Funktion lädt die erste Ebene eines
' Verzeichnisses und gibt die Nodes als Collectionen
' zurück
Function LoadWithFolders(oTreeView As TreeView, _
  sDirectory As String, _
  sImage As String, _
  sExpandedImage As String) As Collection
 
  Dim vFolder         As Variant
  Dim oNode           As Node
  Dim coNodes         As New Collection
  Dim coFolders       As New Collection
 
  ' Unterordner holen
  Set coFolders = GetSubFolders(sDirectory)
  For Each vFolder In coFolders
    ' jeden Ordner mit Bild dem TreeView hinzufügen
    Set oNode = oTreeView.Nodes.Add(, tvwLast, , vFolder, sImage)
 
    ' Icon setzen, wenn es aufgeklappt wird
    oNode.ExpandedImage = sExpandedImage
    Call coNodes.Add(oNode)
  Next vFolder
  Set LoadWithFolders = coNodes
End Function
' Diese Funktion fügt alle Unterordner eines Verzeichnisses
' dem TreeView hinzu und das gleiche nochmal für jeden
' Unterordner (damit das '+' zum expandieren auch da
' ist)
Function AddFolders(oTreeView As TreeView, _
  oParentNode As Node, _
  sDirectory As String, _
  sImage As String, _
  sExpandedImage As String) As Collection
 
  Dim x               As Long
  Dim oChildNode      As Node
  Dim coChildNodes    As New Collection
 
  Set coChildNodes = AddSubFolders(oTreeView, oParentNode, _
    sDirectory, sImage, sExpandedImage)
 
  ' Alle Verzeichnisse des Ordners hinzufügen
  For Each oChildNode In coChildNodes
    Call AddSubFolders(oTreeView, oChildNode, _
      sDirectory & "\" & oChildNode.Text, _
      sImage, sExpandedImage)
  Next oChildNode
 
  Set AddFolders = coChildNodes
End Function
' Diese Funktion fügt alle Unterordner eines
' Verzeichnisses hinzu.
' Hierbei werden alle Nodes erstmal gelöscht, damit
' auch immer alles aktuell bleibt
Function AddSubFolders(oTreeView As TreeView, _
  oParentNode As Node, _
  sDirectory As String, _
  sImage As String, _
  sExpandedImage As String) As Collection
 
  Dim vSubFolder      As Variant
  Dim oNode           As Node
  Dim coSubFolders    As Collection
  Dim coChildNodes    As New Collection
 
  Set coSubFolders = GetSubFolders(sDirectory)
 
  ' Childnodes löschen
  Call DeleteChildNodes(oTreeView, oParentNode)
 
  ' Hinzufügen aller Childnodes
  For Each vSubFolder In coSubFolders
    Set oNode = oTreeView.Nodes.Add(oParentNode, _
      tvwChild, , vSubFolder, sImage)
    oNode.ExpandedImage = sExpandedImage
    Call coChildNodes.Add(oNode)
  Next vSubFolder
 
  Set AddSubFolders = coChildNodes
End Function
' Diese  Funktion löscht alle Childnodes eines
' Node-Objekts
Sub DeleteChildNodes(oTreeView As TreeView, _
  oNode As Node)
 
  Dim x               As Long
  Dim oChildNode      As Node
  Dim oNextNode       As Node
 
  ' 1. Childnode
  Set oChildNode = oNode.Child
  For x = 1 To oNode.Children
    ' Nächstes Childnode "merken"
    Set oNextNode = oChildNode.Next
 
    ' Childnode löschen
    Call oTreeView.Nodes.Remove(oChildNode.Index)
 
    ' Gehe zu nächstem Childnode
    Set oChildNode = oNextNode
  Next x
End Sub
' Diese Funktion ermittelt die Unterordner eines
' Verzeichnisses und gibt deren Namen in einer
' Collection zurück
Function GetSubFolders(sDirectory As String) As Collection
 
  Dim sFolder         As String
  Dim coSubFolders    As New Collection
 
  If ExistDir(sDirectory) Then
    sFolder = Dir(sDirectory & "\*", vbDirectory)
    Do While sFolder <> vbNullString
      ' aus den alten DOS Zeiten, gibt es noch die
      ' Ordner, die einfach nur "." und ".." heißen.
      ' Diese werden hier aussortiert.
      If Left$(sFolder, 1) <> "." And ExistDir(sDirectory & "\" & sFolder) Then
        Call coSubFolders.Add(sFolder)
      End If
 
      ' nächsten Ordner
      sFolder = Dir
    Loop
    Set GetSubFolders = coSubFolders
  End If
End Function
' Diese Funktion überprüft, ob es sich bei dem
' übergebenen Verzeichnis um einen existierenden
' Ordner handelt
Function ExistDir(sdir As String) As Boolean
  ' Falls Verzeichnis nicht vorhanden ist
  On Error Resume Next
  ExistDir = ((GetAttr(sdir) And vbDirectory)) And (Err = 0)
  On Error GoTo 0
End Function

Beispiel:

  • Platzieren Sie auf dem Formular ein TreeView-Control
  • Platzieren Sie eine ImageList auf die Form, fügen ein Bild mit einem geschlossenem Ordner hinzu und legen als Key "OrdnerZu" fest
  • Fügen Sie der ImageList ein weiteres Bild mit einem offenem Ordner hinzu und legen als Key "OrdnerOffen" fest

Option Explicit
 
Private sDirectory As String
 
Private Sub Form_Load()
  ' ImageList zuordnen
  Set TreeView1.ImageList = ImageList1
 
  ' Startordner
  sDirectory = "c:"
 
  ' Alle Ordner in C: anzeigen
  Call LoadWithFolders(TreeView1, sDirectory, _
    "OrdnerZu", "OrdnerOffen")
End Sub
Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
  Call AddFolders(TreeView1, Node, _
    sDirectory & "\" & Node.FullPath, _
    "OrdnerZu", "OrdnerOffen")
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  Call AddSubFolders(TreeView1, Node, _
    sDirectory & "\" & Node.FullPath, _
    "OrdnerZu", "OrdnerOffen")
End Sub

Dieser Tipp wurde bereits 24.491 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