Populate Treeview

  • VB.NET
  • .NET (FX) 4.0

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Populate Treeview

    Moin Leute,

    ich bin dabei ein TreeView zu befüllen und zwar wie folgt:

    VB.NET-Quellcode

    1. Sub populateTreeview()
    2. Dim myPos As Integer
    3. Dim myPath As String
    4. myPath = "N:\93 - GitHub\PrintJobs\PrintJobs\bin\Debug\Clients"
    5. Dim myFolder As String
    6. myPos = InStrRev(myPath, "\", -1, vbTextCompare)
    7. If myPos > 0 Then
    8. myFolder = Mid(myPath, myPos + 1)
    9. End If
    10. With TreeView.Nodes
    11. With .Add(myFolder)
    12. '.Nodes.Add(myFolder)
    13. End With
    14. End With
    15. End Sub


    klappt auch soweit (eingeschränkt..)
    mein Problem ist das mein Treeview jetzt so aussieht:





    was wäre nun die beste Herangehensweise damit ich meine Ordnersstruktur:

    Spoiler anzeigen


    [Ordner]
    0ANJ1072
    0KAY1074
    0SIM1073
    0SIM1075
    [\Ordner]

    [Datein in den jewils gleichnamigen Ordner]
    0ANJ1072.txt
    0KAY1074.txt
    0SIM1073.txt
    0SIM1075.txt


    welche alle gleichnamigen Dateien enthalten sinnvoll im TreeView auflisten kann?
    Bilder
    • clients.PNG

      594 Byte, 179×78, 334 mal angesehen

    Gelöschter Benutzer schrieb:

    VB.NET-Quellcode

    1. myPos = InStrRev(myPath, "\", -1, vbTextCompare)
    Was soll diese ranz VB6-Methode?
    Nimm Dir eine DirectoryInfo-Instanz und zerlege die mit .Parent.
    Bei welcher Gelegenheit soll da ein SubItem generiert werden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Sorry ich stand da wohl mit meinem Proof-of-Concept müll etwas auf dem Schlauch

    VB.NET-Quellcode

    1. Sub populateTreeview()
    2. Dim myPath As String
    3. myPath = "N:\93 - GitHub\PrintJobs\PrintJobs\bin\Debug\Clients"
    4. For Each Dir As String In System.IO.Directory.GetDirectories(myPath)
    5. Dim dirInfo As New System.IO.DirectoryInfo(Dir)
    6. With TreeView.Nodes
    7. With .Add(dirInfo.Name)
    8. '.Nodes.Add(clientFolder)
    9. End With
    10. End With
    11. Next
    12. End Sub


    nun sieht das ganze so aus:



    die frage ist nun: wie bekomme ich die Unterordner da zu geordnet?
    wie gehe ich da vor?
    Bilder
    • clients.PNG

      1,6 kB, 159×98, 328 mal angesehen
    @Kameo Da musst Du rekursiv vorgehen.
    Probier mal dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. populateTreeview("c:\Temp")
    3. End Sub
    4. Sub populateTreeview(Path As String)
    5. If System.IO.Directory.Exists(Path) Then
    6. Dim nNode As New TreeNode(Path)
    7. Me.TreeView1.Nodes.Add(nNode)
    8. Me.FillTreeNode(nNode)
    9. End If
    10. End Sub
    11. Private Sub FillTreeNode(ByVal dNode As TreeNode)
    12. Try
    13. Dim d As New DirectoryInfo(dNode.FullPath)
    14. For Each di As DirectoryInfo In d.GetDirectories
    15. Dim nNode As New TreeNode(di.Name, 0, 0)
    16. dNode.Nodes.Add(nNode)
    17. FillTreeNode(nNode)
    18. Next
    19. For Each fi As FileInfo In d.GetFiles
    20. Dim fNode = New TreeNode(fi.Name)
    21. dNode.Nodes.Add(fNode)
    22. Next
    23. Catch
    24. End Try
    25. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    rekursiv
    gib das Stichwort mal bei Wikipedia ein.

    Also sowohl das Dateisystem als auch eine Treeview sind rekursive Datenstrukturen:
    Ein Node im Treeview kann (muss nicht) weitere Nodes enthalten welche wiederum weitere weitere Nodes... und so weiter.
    Und ein DateiOrdner kann (muss nicht) weitere DateiOrdner enthalten welche wiederum weitere weitere DateiOrdner... und so weiter.

    Deshalb ist ein Treeview gut geeignet, die Struktur des Dateisystems anzuzeigen.
    Nu hast du eiglich noch mit keinem Wort erwähnt, was du eiglich machen willst - kann es sein, dass du die Struktur des Dateisystems in einem Treeview anzeigen willst?

    Dann musste den Treeview mit einer rekursiven Methode befüllen (also wenn das der Fall ist)
    @RodFromGermany

    Vielen Dank schonmal dafür! :thumbup:

    Eine Frage hätte ich da noch:
    Warum hier nun Try-Catch? (Dachte es ist verpöhnt..)
    Dient es hier lediglich dem Zweck das man auf keine "NoPermissionException" stößt?

    Und gibt es noch eine möglichkeit mir nur das "Clients" aus dem Pfad anzeigen zu lassen?
    Sprich das der restliche Dateipfad "ausgeblendet" wird.
    So war es ja vorher bei mir, aber bei Rod´s Methode weiß ich nicht wie ich da an der DirectoryInfo noch was machen kann, denn durch

    Quellcode

    1. Dim d As New DirectoryInfo(dNode.FullPath)

    bekomme ich ja nur den FullPath und kann dort auch nichts anderes verwenden

    Das ganze hat ehr kosmetische Gründe.

    @ErfinderDesRades

    kann es sein, dass du die Struktur des Dateisystems in einem Treeview anzeigen willst?


    genauso sieht es aus!

    Das Stichwort rekursive klingt gut, werde mich da mal hinenlesen!
    Und da ein Ordner mehrere Dateien enthalten wird dachte ich mir der TreeView wäre am besten geeignet dafür.
    Ich habe es nur immer nicht hinbekommen die jeweiligen Dateien den richtigen Ordner zuzuordnen

    Vielen Dank euch beiden!
    Bilder
    • clients.PNG

      3,25 kB, 328×112, 116 mal angesehen

    Gelöschter Benutzer schrieb:

    Warum hier nun Try-Catch?
    Das war alter Code aus der Trickkiste, werde es ändern.
    Allerdings wäre dass dann eine UnauthorizedAccessException.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Gelöschter Benutzer schrieb:

    UnauthorizedAccessException
    heißt das Ding, ich habe es experimentell verifiziert. 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Und gibt es noch eine möglichkeit mir nur das "Clients" aus dem Pfad anzeigen zu lassen?
    Sprich das der restliche Dateipfad "ausgeblendet" wird.
    So war es ja vorher bei mir, aber bei Rod´s Methode weiß ich nicht wie ich da an der DirectoryInfo noch was machen kann, denn durch
    Dim d As New DirectoryInfo(dNode.FullPath)

    bekomme ich ja nur den FullPath und kann dort auch nichts anderes verwenden

    kannst du mir ja eventuell noch einen Tipp geben?
    @Kameo Kannst Du bitte dazu ein Problem formulieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Aber sicher doch:

    Mein Treeview befüllen ich ja aus diesem Pfad:

    "N:\93 - GitHub\PrintJobs\PrintJobs\bin\Debug\Clients

    Dieser wird ja nun auch im Treeview als erste Node angezeigt (siehe oben).
    Bei deinem Source wird ja nun mit .dNode.FullPath der komplette Pfad eingelesen, was ja auch gewollt ist.
    Mein Problem ist nun, dass ich gerne nur "Clients" als erste Treeview Node angezeigt bekommen möchte. Spricht den String: myPath = "N:\93 - GitHub\PrintJobs\PrintJobs\bin\Debug\Clients So "zerstückeln" das nur noch das "Clients" über bleibt.
    wie ist da die beste Herangehensweise, bitte wenn nur Pseudocode ich würde es gerne verstehen und nicht nur C&P

    Gelöschter Benutzer schrieb:

    das nur noch das "Clients" über bleibt.
    Dann hast Du das Prinzip nicht verstanden.
    Iterativ heißt stets, von der Root zum langen Pfad.
    Mit populateTreeview("C:\Temp\93 - GitHub") komme ich auf dieses Bild:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!