【问题标题】:Populate Treeview with directory from Combobox.Text使用 Combobox.Text 中的目录填充 Treeview
【发布时间】:2016-11-09 22:35:30
【问题描述】:

我有一个组合框,可以从中选择文件夹名称。在我的 D:\ 中搜索此文件夹,当找到它们时,也必须在其中找到名为“Versions”的文件夹。然后这个“版本”子文件夹需要填充树视图上的所有子文件夹。关于如何做到这一点的任何想法,我真的碰到了这个?!?到目前为止我的代码(没有错误,但没有任何反应):

编辑后的代码(仍然无效):

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

这是一个屏幕截图和我需要的另一种解释:

因此,第一个代码必须搜索名为“Microsoft”的文件夹,如组合框项所示。然后,在此文件夹中,必须对名为“Versions”的文件夹进行另一次搜索。最后,从“版本”填充所有底层子文件夹/文件。在 Treeview 上的“版本”之前或同一级别没有文件夹!在这种情况下,我的“版本”路径是“D:\MyDocuments\Programmes\Microsoft\Versions\” - 搜索路径不同,但都在“D:\”目录中,并且都包含“版本”文件夹。

非常感谢任何帮助,在此先感谢!

【问题讨论】:

  • 这是一个调试问题。代码运行时 MyCombo.Text 的值是多少?
  • @LarsTech, MyCombo.Text 值为“Microsoft” - 所以它应该在 D:\ 中搜索 Microsoft 文件夹。搜索路径没问题。正如我在调试器中看到的那样,它停留在“对于每个 f 作为 FileInfo”。
  • 代码按其他方式发布。
  • @LarsTech 不适合我。我的情况可能有什么问题?
  • 也适合我。

标签: vb.net combobox treeview


【解决方案1】:

这将在Treeview 中填充文件夹和文件,这些文件夹和文件按照它们在磁盘上的方式进行组织......但是等等,还有更多:

我需要显示的只是一个文件夹/文件名,

重新编辑:代码与前两个版本大致相同,只是分解了一些帮助程序以“找到”起点和特定的子文件夹:

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

用法:

    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*")

它在文件夹之后添加起始文件夹的文件(如资源管理器)。我不确定你为什么使用DirectoryInfo.GetFiles()) and getting a bunch ofFileInfoobjects if you just want the name. This usesDirectory.EnumerateFiles()which is a little more efficient thanGetFiles()`。

我的测试起点有一些障碍和要排除的文件夹/文件:

结果似乎是你想要的。它还添加了一个图标,以便您可以区分文件夹中的文件:


要获取每种文件类型的关联图标,请参阅 Show folder icon in a listview。不要让 ListView 部分让您失望 - 两个控件都使用 ImageList 来存储图像。

【讨论】:

  • 谢谢,我明天会测试这个。虽然我需要显示的只是一个文件夹/文件名,但不包括您在示例中提供的路径。而且我仍然需要部分代码来搜索我的“Microsoft”文件夹......但我想我可以改变它......图标看起来非常好 - 这里有一个问题 - 我可以像资源管理器那样使用文件图标吗? (如果我没记错的话,来自 .dll)
  • 我测试了你的代码,但我不适合我,我收到错误“指定的参数超出了有效值的范围。”在“tv1.Nodes(0).Text = 文件夹”行中。请看一下我编辑的问题,你会在我提供的图片下看到另一个解释。
猜你喜欢
  • 2010-12-30
  • 2011-09-08
  • 2017-04-18
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多