vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v2.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2016
 
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:  18.590 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise bis zu 120,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 479,20 EUR statt 599,- EUR
  • sevDTA 2.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 20,00 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 55,20 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    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 18.590 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-2016 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