C#如何使用treeView在不显示根目录的情况下列出目录和子目录

本文关键字:情况下 子目录 根目录 何使用 treeView 显示 | 更新日期: 2023-09-27 18:27:59

来自

main folder
|_a
| |_b
| |_c
|_d
|_e

a
 |_b
 |_c
d
e

我想要一个没有主文件夹的树状视图。我在这里找到了一个解决方案,但它似乎非常慢。当我第一次启动这个程序时,加载它需要一分钟多的时间。如果没有这些代码,它会立即打开。

那么,你知道为什么要改进这个代码或另一个更好的代码吗?

编辑:已解决

C#如何使用treeView在不显示根目录的情况下列出目录和子目录

试试这个,它在这里看起来真的很快。您可以控制是否展开所有节点。。您需要包括LINQ namspace(using System.Linq;

// somewhere:
string yourRoot = "D:''";
treeView1.Nodes.AddRange(getFolderNodes(yourRoot, true).ToArray());
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    TreeNode tn = e.Node.Nodes[0];
    if (tn.Text == "...")
    {
        e.Node.Nodes.AddRange(getFolderNodes(((DirectoryInfo)e.Node.Tag)
              .FullName, true).ToArray());
        if (tn.Text == "...") tn.Parent.Nodes.Remove(tn);
    }
}
List<TreeNode> getFolderNodes(string dir, bool expanded)
{
    var dirs = Directory.GetDirectories(dir).ToArray();
    var nodes = new List<TreeNode>();
    foreach (string d in dirs)
    {
        DirectoryInfo di = new DirectoryInfo(d);
        TreeNode tn = new TreeNode(di.Name);
        tn.Tag = di;
        int subCount = 0;
        try { subCount = Directory.GetDirectories(d).Count();  } 
        catch { /* ignore accessdenied */  }
        if (subCount > 0) tn.Nodes.Add("...");
        if (expanded) tn.Expand();   //  **
        nodes.Add(tn);
    }
    return nodes;
}

如果你确定你总是想看到所有级别从一开始就被加载,你可以使用这个功能并删除BeforeExpand代码:

List<TreeNode> getAllFolderNodes(string dir)
{
    var dirs = Directory.GetDirectories(dir).ToArray();
    var nodes = new List<TreeNode>();
    foreach (string d in dirs)
    {
        DirectoryInfo di = new DirectoryInfo(d);
        TreeNode tn = new TreeNode(di.Name);
        tn.Tag = di;
        int subCount = 0;
        try { subCount = Directory.GetDirectories(d).Count(); } 
        catch { /* ignore accessdenied */  }
        if (subCount > 0)
        {
            var subNodes = getAllFolderNodes(di.FullName);
            tn.Nodes.AddRange(subNodes.ToArray());
        }
        nodes.Add(tn);
    }
    return nodes;
}

你称之为

string yourRoot = "D:''";
Cursor.Current = Cursors.WaitCursor;
treeView1.Nodes.AddRange(getAllFolderNodes(yourRoot).ToArray());
Cursor.Current = Cursors.Default;