【问题标题】:Displaying SPECIFIC folders/files in treeview在树视图中显示特定文件夹/文件
【发布时间】:2014-01-28 16:26:58
【问题描述】:

在互联网上搜索了一种尽可能精简的方法后,我找不到适合我的方法。我从this question 获取了代码,试图让它工作,但不知道如何挽救我的生命。这是我所拥有的:

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'Get a list of drives
    Dim drives As System.Collections.ObjectModel.ReadOnlyCollection(Of DriveInfo) = My.Computer.FileSystem.Drives
    Dim rootDir As String = String.empty
    'Now loop thru each drive and populate the treeview
    For i As Integer = 0 To drives.Count - 1
        rootDir = drives(i).Name
        'Add this drive as a root node
        TreeView1.Nodes.Add(rootDir)
        'Populate this root node
        PopulateTreeView(rootDir, TreeView1.Nodes(i))
    Next

End Sub

Private Sub PopulateTreeView(ByVal dir As String, ByVal parentNode As TreeNode)
    Dim folder As String = String.Empty
    Try
        Dim folders() As String = IO.Directory.GetDirectories(dir)
        If folders.Length <> 0 Then
            Dim childNode As TreeNode = Nothing
            For Each folder In folders
                childNode = New TreeNode(folder)
                parentNode.Nodes.Add(childNode)
                PopulateTreeView(folder, childNode)
            Next
        End If
    Catch ex As UnauthorizedAccessException
        parentNode.Nodes.Add(folder & ": Access Denied")
    End Try
End Sub

但是,它只列出了驱动器及其文件夹,我需要它从一开始就列出特定目录中的目录和文件,而不必一直沿着树向下查找您要查找的内容。我尝试将rootDir 更改为我尝试访问的特定文件夹的地址,但无济于事。有人有什么建议吗?

【问题讨论】:

  • 您是否尝试仅在展开的父级上显示文件夹/文件?您当前的实现将列出整个机器上每个文件夹中的每个文件。它需要永远。当用户单击展开一个目录时,为什么不从顶级目录和PopulateTreeView 开始呢?一次更快,强度更低。
  • 我要做的是采用上面的代码,它适用于特定路径而不是所有驱动器。
  • 上面的代码已经可以在特定路径上运行。像这样调用 PopulateTreeView:PopulateTreeView(yourPath, TreeView1.Nodes(0))。看看下面我的回答,你会注意到它确实针对特定路径执行此操作,并在点击时触发。

标签: vb.net winforms treeview


【解决方案1】:

我不确定我是否理解这个问题,但根据我在原始问题中的评论:此代码将执行我在该评论中所说的内容。它是用 C# but here is a converter 编写的。另外:它可能还没有准备好生产,但它是一个开始。

private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        //Get a list of drives
        DriveInfo[] drives = DriveInfo.GetDrives();
        string rootDir = string.Empty;
        //Now loop thru each drive and populate the treeview
        for (int i = 0; i <= drives.Length - 1; i++)
        {
            rootDir = drives[i].Name;
            //Add this drive as a root node
            TreeView1.Nodes.Add(rootDir);
            //Populate this root node
            PopulateTreeView(rootDir, TreeView1.Nodes[i]);
        }

    }
    private void PopulateTreeView(string dir, TreeNode parentNode)
    {
        string folder = string.Empty;
        try
        {
            string[] folders = System.IO.Directory.GetDirectories(dir);
            if (folders.Length != 0)
            {
                TreeNode childNode = null;
                foreach (string folder_loopVariable in folders)
                {
                    folder = folder_loopVariable;
                    childNode = new TreeNode(folder);
                    childNode.Nodes.Add("");
                    parentNode.Nodes.Add(childNode);
                }
            }
            string[] files = System.IO.Directory.GetFiles(dir);
            if (files.Length != 0)
            {
                TreeNode childNode = null;
                foreach (string file in files)
                {
                    childNode = new TreeNode(file);
                    parentNode.Nodes.Add(childNode);
                }
            }
        }
        catch (UnauthorizedAccessException ex)
        {
            parentNode.Nodes.Add(folder + ": Access Denied");
        }
    }

    private void TreeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        TreeNode actual = e.Node;
        actual.Nodes[0].Remove();
        PopulateTreeView(actual.Text, actual);
    }

    private void TreeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
    {
        TreeNode actual = e.Node;
        actual.Nodes.Clear();
        actual.Nodes.Add("");

    }

【讨论】:

  • 谢谢布兰登!这适用于我转换后的需要,完全没有问题。然而,我遇到的一件事是,这可能很容易解决,我只是太笨了,无法弄清楚,这就是为什么它只会列出一个文件夹。示例:它列出了驱动器,我展开其中一个驱动器,它列出了文件夹/文件,我展开了文件夹,没有列出任何内容。有什么指点吗?
  • 所以这很奇怪。我有我在 S.O. 上帮助过的人的所有东西。在一个项目中,以便我可以在以后返回并参考它(出于这个确切原因)。我取消了您的问题的注释(最初是有效的),突然间我遇到了您描述的问题......我假设您复制并粘贴了我的代码?由于您使用的是 C#,因此表单编辑器不会自动将事件处理代码连接到表单控件。在设计器中单击您的树视图,在属性选项卡中选择闪电并将“BeforeCollapse”和“BeforeExpand”更改为从上面复制的 void 方法。
  • 哦,还有:如果我的答案是已接受的答案,请记住接受它作为您问题的答案;)
  • 还有两件事:现在两次列出二级目录,背靠背。我打开顶部文件夹,所有内容都列出了两次。另外,我不想为此提出一个新问题。是否可以从文件名中删除除实际文件名本身之外的所有内容。示例:C:\folder\index.html 变成了 index.html?
  • 二级目录列出两次:检查您的 Treeview 事件。确保“BeforeCollapse”设置为“Treeview1_BeforeCollapse”,“BeforeExpand”设置为“Treeview1_BeforeExpand”。通过将两个事件都设置为“TreeView1_BeforeExpand”,我能够重现双目录。我会发布一张图片以使其更容易,但公司政策禁止 imgur.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2011-06-29
  • 2015-02-24
相关资源
最近更新 更多