2016-11-08 1 views
0

füllen Ich habe eine Combobox, aus der ich Ordner Namen auswählen. Diese Ordner werden in meinem D: \ gesucht und wenn sie gefunden werden, muss ein Ordner mit dem Namen "Versions" in Es gefunden werden. Dann muss dieser Unterordner "Versions" mit allen Unterordnern in einer Treeview ausgefüllt werden. Irgendwelche Ideen, wie ich das machen könnte, ich bin wirklich auf dieses gestoßen?!? Mein Code bisher (keine Fehler, aber es passiert nichts):TreeView mit Verzeichnis aus Combobox.Text

EDITED CODE (noch nicht funktioniert):

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

Dim folder1 As String() = Directory.GetDirectories("D:\", MyCombo.Text, System.IO.SearchOption.AllDirectories) 
    For Each folder1 As String In MyDirectory 
     Dim SubDirectories As String() = IO.Directory.GetDirectories(folder1, "*Versions*", System.IO.SearchOption.AllDirectories) 
     For Each subfolder In SubDirectories 
      PopulateFolder(subfolder) 
     Next 
    Next 
End Sub 

Private Sub PopulateFolder(folder As String) 

    tv1.Nodes(0).Text = folder 
    tv1.Nodes(0).ImageIndex = 1 
    Dim DirSep = Path.DirectorySeparatorChar 
    Dim thisFolder As String 
    Dim tn As TreeNode 

    For Each d As String In Directory.EnumerateDirectories(folder) 
      ' split the path to get the last segment 
      Dim split = d.Split(DirSep) 
      thisFolder = split(split.Length - 1) 
      tn = New TreeNode(thisFolder, 1, 1) 
      tv1.Nodes(0).Nodes.Add(tn) 
      PopulateFiles(tn, d) 
     Next 
     PopulateFiles(tv1.Nodes(0), folder) 
End Sub 

Private Sub PopulateFiles(tn As TreeNode, folder As String) 

    For Each f As String In Directory.EnumerateFiles(folder, "*.*") 
     ' Path will extract the name: 
     tn.Nodes.Add("", Path.GetFileName(f), 0) 
    Next 
End Sub 

Hier ist ein Screenshot UND EINE ANDERE Erklärung, was ich brauche:

enter image description here

So muss der erste Code nach dem Ordner "Microsoft" suchen, wie das Combobox-Objekt zeigt. In diesem Ordner muss dann eine weitere Suche nach dem Ordner "Versionen" durchgeführt werden. Und schließlich füllen Sie alle zugrunde liegenden Unterordner/Dateien aus "Versionen". KEINE Ordner vor oder auf derselben Ebene wie "Versionen" in Treeview! In diesem Fall ist mein Pfad zu "Versionen" "D: \ MyDocuments \ Programs \ Microsoft \ Versions \" - die Suchpfade sind unterschiedlich, aber alle befinden sich im Verzeichnis "D: \" und alle enthalten den Ordner "Versions".

Jede Hilfe sehr geschätzt, danke im Voraus!

+0

Dies ist ein Debugging-Problem. Was ist der Wert von MyCombo.Text, wenn der Code ausgeführt wird? – LarsTech

+0

@LarsTech, MyCombo.Text Wert ist "Microsoft" - so sollte es nach Microsoft-Ordner in D: \ suchen. Suche nach Pfad ist O.K.Wie ich es im Debugger sehe, bleibt es bei "Für jeden f als FileInfo" stecken. – LuckyLuke82

+0

Code funktioniert wie anders geschrieben. – LarsTech

Antwort

1

Dieses eine Treeview mit Ordnern und Dateien organisiert bevölkern werden, wie sie auf der Festplatte sind ... Aber warten Sie es mehr:

was brauche ich nur ein Ordner/Dateiname ist angezeigt,

In re Edit: der Code bleibt sehr ähnlich wie die ersten beiden Versionen, nur ein paar Helfer ausgebrochen wurden zu „finden“ den Ausgangspunkt und die spezifischen untergeordneten Ordner:

Private Function FindVersionsFolder(startFolder As String) As String 
    ' find a folder named "Versions" to be used as the start point 
    ' note: can return "" when not found 
    Dim curPath As String = Path.Combine(startFolder, "Versions") 
    Dim temp As String = "" 

    If Directory.Exists(curPath) Then 
     Return curPath 
    Else 
     For Each d As String In Directory.EnumerateDirectories(startFolder) 
      temp = FindVersionsFolder(d) 
      If String.IsNullOrEmpty(temp) = False Then Return temp 
     Next 
    End If 
    Return "" 

End Function 

Private Sub PopulateFolder(folder As String, parentNode As TreeNode, 
          Optional pattern As String = "*") 
    ' create node for current folder, 
    ' add child folders 
    ' add files contained 
    Dim thisFolder As String 
    Dim tn As TreeNode 

    For Each d As String In Directory.EnumerateDirectories(folder, pattern) 
     thisFolder = GetLastFolder(d) 

     tn = New TreeNode(thisFolder, 1, 1) 
     parentNode.Nodes.Add(tn) 

     ' recurse to add child folders 
     PopulateFolder(d, tn) 
     ' populate files in this folder 
     PopulateFiles(tn, d) 
    Next 
    ' if desired the files in base "VERSIONS" folder 
    'PopulateFiles(tv1.Nodes(0), folder) 
End Sub 

Private Function GetLastFolder(fullPath As String) As String 
    ' trim to the last folder segment 
    Dim DirSep = Path.DirectorySeparatorChar 
    Dim split = fullPath.Split(DirSep) 
    Return split(split.Length - 1) 
End Function 

Private Sub PopulateFiles(tn As TreeNode, folder As String) 
    ' add all files for a folder 
    For Each f As String In Directory.EnumerateFiles(folder, "*.*") 
     tn.Nodes.Add("", Path.GetFileName(f), 0) 
    Next 
End Sub 

Verbrauch:

Dim startFolder = "C:\Temp\Microsoft" 
    ' modify root node 
    tv1.TopNode.Text = GetLastFolder(startFolder) 
    tv1.TopNode.ImageIndex = 1 

    ' find the starting point 
    startFolder = FindVersionsFolder(startFolder) 

    ' populate TV from that point 
    PopulateFolder(startFolder, tv1.Nodes(0), "Ver*") 

Es fügt die Dateien für den Startordner nach dem Ordner (wie Explorer). Ich bin mir nicht sicher, warum Sie DirectoryInfo.GetFiles()) and getting a bunch of FileInfo verwenden objects if you just want the name. This uses Directory.EnumerateFiles() which is a little more efficient than GetFiles() `.

Mein Test Ausgangspunkt hat einige Hindernisse und Ordner/Datei ausgeschlossen werden:

enter image description here

Das Ergebnis zu sein, was scheint, Sie wollen. Es fügt auch ein Symbol, so dass Sie Dateien von Ordnern können sagen:

enter image description hereenter image description here


Um das zugehörige Symbol für jeden Dateityp zu erhalten, siehe Show folder icon in a listview. Lassen Sie sich nicht vom ListView Teil wegwerfen - beide Steuerelemente verwenden eine ImageList für Bilder.

+0

danke, ich werde das morgen testen. Obwohl, was ich anzeigen muss, ist nur ein Ordner/Dateiname, ausgenommen Es ist Pfad wie Sie in Probe zur Verfügung gestellt. Und ich brauche noch einen Teil des Codes, um meinen "Microsoft" Ordner zu durchsuchen ... Aber ich denke, dass ich das ändern kann ... Sieht sehr gut aus mit Icons - eine Frage hier - kann ich Icons für Dateien wie Explorer verwenden? (von .dll, wenn ich mich nicht irre) – LuckyLuke82

+0

Ich habe Ihren Code getestet, aber ich arbeite nicht für mich, ich bekomme den Fehler "Das angegebene Argument lag außerhalb des Bereichs der gültigen Werte." in Zeile "tv1.Nodes (0) .Text = Ordner". Sehen Sie sich meine bearbeitete Frage an. Sie sehen eine weitere Erklärung unter dem Bild, das ich zur Verfügung gestellt habe. – LuckyLuke82