获取文件夹到树视图

本文关键字:视图 文件夹 获取 | 更新日期: 2023-09-27 17:56:59

我使用以下代码将文件夹的内容放入TreeView中。但当前代码始终将内容添加到树视图的根目录中。它不会将它们添加为其父文件夹节点的子节点。

你可以帮我吗?

void Recurse(string path)
{
    DirectoryInfo info = new DirectoryInfo(path);
    TreeNode root = new TreeNode(info.Name);
    string[] sub = Directory.GetDirectories(info.FullName);
    TreeNode node = new TreeNode();
    MailTree.Nodes.Add(root);
    if (sub.Length == 0) {
    }
    else
    {
        foreach(string i in sub)
        {       
            DirectoryInfo subinfo = new DirectoryInfo(i);                    
            root.Nodes.Add(subinfo.Name);                    
            Recurse(i);                  
        }
        //MailTree.Nodes.Add(root);
    }   
}

获取文件夹到树视图

您应该将根节点作为 Rescure 方法的一部分传递,类似于 Rescure(string path, TreeNode currentRoot) .

现在,您可以调用 currentRoot.Nodes.Add(root) 代替 MailTree.Nodes.Add(root) ,这将确保仅将 brance 添加到当前级别。您还需要将循环中的呼叫更改为 Rescure(i, root)

最后,对 Rescure 的初始调用应包括对预先创建的根节点的引用,因此类似于 Rescure(initialDirectory, initialRootNode)

我要补充的一件事是,应该更改您的方法和变量名称以反映它们的含义。是的,您正在递归,但为什么?该方法的更好名称可能是 TraverseDirectory 。同样,与其foreach(string i in sub),为什么不foreach(string directoryName in sub)?拥有清晰的代码几乎与拥有正确的代码一样重要。

函数的递归部分始终是将子节点添加到根节点。您需要添加"父节点"作为递归函数的参数。像这样:

void Recurse(string path, TreeNode parentNode)
{
    DirectoryInfo info = new DirectoryInfo(path);
    TreeNode node = new TreeNode(info.Name);
    if (parentNode == null)
        MailTree.Nodes.Add(node);
    else
        parentNode.Nodes.Add(node);
    string[] sub = Directory.GetDirectories(path);
    if (sub.Length != 0)
    {
        foreach(string i in sub)
        {       
            Recurse(i, node);                  
        }
    }   
}

乍一看,我看不出代码中的任何错误,但我可以建议采取另一种方法:您展示的方法太贵了。只需在树上填充一个关卡,并在您添加的每个节点中放置一些虚拟物品作为叶子。然后截获 NodeExpand 事件,删除虚拟节点,并添加子节点(递归应用添加虚拟子节点的相同策略)