使用文件系统目录结构填充TreeView

34

我是一个新手,正在学习Nodes。 :) 我想到了这个算法,但它只显示父节点的列表.. 就像这样..

a
   a.txt
   b
   c
c
   m
   n
b
   o
   p
etc...

我希望下一个节点被放置在前一个节点中的一个节点内,就像这样:

a
   a.txt
   b
      o
      p
   c
      m
      n
etc...
我有一些想法,但我不知道如何编写代码... :) 请帮忙。
private void ListDirectory(TreeView treeView, String path)
{            
    Stack<string> stack = new Stack<string>();
    TreeNode DirFilesCollection = new TreeNode();

    stack.Push(path);            

    while (stack.Count > 0)
    {
        string dir = stack.Pop();
        try
        {
            List<String> parentDir = new List<string>();
            parentDir.AddRange(Directory.GetFiles(dir, "*.*"));
            parentDir.AddRange(Directory.GetDirectories(dir));

            DirectoryInfo d = new DirectoryInfo(dir);
            TreeNode TParent = new TreeNode(d.Name);

            foreach (String s in parentDir)
            {
                FileInfo f = new FileInfo(s);
                TreeNode subItems = new TreeNode(f.Name);

                TParent.Nodes.Add(subItems);
            }

            DirFilesCollection.Nodes.Add(TParent);

            foreach (string dn in Directory.GetDirectories(dir))
            {
                stack.Push(dn);
            }
        }
        catch
        {}
    }

    Action clearTreeView = () => treeView.Nodes.Clear();
    this.Invoke(clearTreeView);

    Action showTreeView = () => treeView.Nodes.Add(DirFilesCollection);
    this.Invoke(showTreeView);
}

嘿@Vincent Dagpin,你能展示一下你项目的解决方案吗?我正在做和你一样的事情,但是我找不到任何提供模板的视频或帖子 - 你的问题是唯一与我的当前项目有关的东西。我真的很感激 :) - Burak
1个回答

118

选项1:递归方法:

private void ListDirectory(TreeView treeView, string path)
{
    treeView.Nodes.Clear();
    var rootDirectoryInfo = new DirectoryInfo(path);
    treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}

private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
    var directoryNode = new TreeNode(directoryInfo.Name);
    foreach (var directory in directoryInfo.GetDirectories())
        directoryNode.Nodes.Add(CreateDirectoryNode(directory));
    foreach (var file in directoryInfo.GetFiles())
        directoryNode.Nodes.Add(new TreeNode(file.Name));
    return directoryNode;
}

第二种选项:非递归方法:

private static void ListDirectory(TreeView treeView, string path)
{
    treeView.Nodes.Clear();

    var stack = new Stack<TreeNode>();
    var rootDirectory = new DirectoryInfo(path);
    var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory };
    stack.Push(node);

    while (stack.Count > 0)
    {
        var currentNode = stack.Pop();
        var directoryInfo = (DirectoryInfo)currentNode.Tag;
        foreach (var directory in directoryInfo.GetDirectories())
        {
            var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory };
            currentNode.Nodes.Add(childDirectoryNode);
            stack.Push(childDirectoryNode);
        }
        foreach (var file in directoryInfo.GetFiles())
            currentNode.Nodes.Add(new TreeNode(file.Name));
    }

    treeView.Nodes.Add(node);
}

5
@vrynxzent - 如果你感兴趣,已经更新了不使用递归方法的答案。 - Alex Aza
1
啊,我明白了。因为线程和异常处理,我更喜欢使用非递归方法。虽然我也可以用递归方法实现,但我需要看到在获取文件和目录时更新数据的表单。 - Vincent Dagpin
6
使用 try-catch 捕获 UnauthorizedAccessException 异常。 - jhoanna
2
我在使用currentNode.Nodes.Add()时遇到了异常。我将其更改为currentNode.ChildNodes.Add(),现在它可以正常工作了。 - Mark B
1
@Mark B FYI:WinForm TreeView 中没有 ChildNodes 属性。 - BillW
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接