获取文件夹到树视图
本文关键字:视图 文件夹 获取 | 更新日期: 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 事件,删除虚拟节点,并添加子节点(递归应用添加虚拟子节点的相同策略)