【问题标题】:C# How to use treeView to list the directories and subdirectories without showing the root directory?C#如何使用treeView列出目录和子目录而不显示根目录?
【发布时间】:2015-12-26 08:46:37
【问题描述】:

来自

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

a
 |_b
 |_c
d
e

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

那么,您知道为什么要改进此代码或其他更好的代码吗?

编辑:已解决

【问题讨论】:

  • 更改它以仅在用户展开节点时使用子目录填充节点。递归枚举整个磁盘上的每个目录可能需要一些时间。
  • 我已经删除了添加文件的部分。实际上,我想要特定目录的所有子目录,但不包括该目录本身。问题是它的处理速度仍然很慢。
  • 你知道它添加了多少目录吗?它做了什么多余的事情吗?如果它只在父级展开时添加,那么任何大小的树都是可管理的(假设文件夹有一半数量的子文件夹)
  • 总共有 600 多个(文件夹和子文件夹)。这个主文件夹有大约 250 个子文件夹,每个文件夹都有 0 到 10 个子文件夹(通常是 2 个)。
  • 这就是所有 UI 对象,所以它会加起来。不过,对于 600 是否应该非常慢,我没有真正的直觉。

标签: c# treeview


【解决方案1】:

试试这个,这里看起来很快。您可以控制是否扩展所有节点。您需要包含 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;

【讨论】:

  • 我试过了。但是有一个问题:我得到的子目录是......(3个点)。我也想看看子目录。我也收到了关于 .ToArray() 的错误,我从代码中删除了 .ToArray() 。我也在使用 ExpandAll() 因为我想查看所有目录和子目录而无需任何额外的点击。
  • 我希望看到类似这样的树视图:i.imgbox.com/jbhLsPSC.png 包含所有这些子文件夹的主文件夹未显示。
  • 虽然我确实将代码编辑为修改后的版本,但它仍然需要向下钻取。如果您有兴趣,我稍后会添加展开所有功能。
  • 但是如果我最后使用ExpandAll(),树没有展开?
  • 我收到此错误:“System.Array”不包含“Count”的定义,并且找不到接受“System.Array”类型的第一个参数的扩展方法“Count”(是您缺少 using 指令或程序集引用?)(CS1061)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多