如何在C#中通过Mega链接将文件夹内容填充到Treeview中?
问题分析
你的代码目前存在两个核心问题:
- 直接将所有文件夹、文件都添加到TreeView的根节点,没有利用Mega节点的
ParentId属性构建层级关系,导致无法展示完整路径结构 - 代码末尾调用了
mainWindow.treeView1.Nodes.Clear(),会清空所有刚添加的节点,最终TreeView没有任何内容
解决方案
要实现按完整路径填充TreeView,需要通过ParentId建立节点的父子映射,递归构建层级结构。以下是修改后的完整代码:
private void LoadMegaTree(string URL, string rootName) { // 初始化Mega客户端并登录,用using自动管理资源释放 using var client = new MegaApiClient(); client.Login(Form3.User, Form3.Pass); Uri fileLink = new Uri(URL); IEnumerable<INode> nodes = client.GetNodesFromLink(fileLink); // 将所有节点存入字典,方便通过ID快速查找父节点 var nodeDict = nodes.ToDictionary(n => n.Id); // 找到共享链接对应的根节点(ParentId为空的节点即为根) var rootMegaNode = nodes.FirstOrDefault(n => string.IsNullOrEmpty(n.ParentId)); if (rootMegaNode == null) return; // 创建TreeView的根节点,优先使用传入的name,否则用Mega根节点名称 var rootTreeNode = new TreeNode(string.IsNullOrEmpty(rootName) ? rootMegaNode.Name : rootName); // 递归构建子节点层级 BuildTreeNodeHierarchy(rootMegaNode, rootTreeNode, nodeDict); // 清空TreeView原有内容,添加新构建的根节点 mainWindow.treeView1.Nodes.Clear(); mainWindow.treeView1.Nodes.Add(rootTreeNode); } // 递归构建TreeNode层级的辅助方法 private void BuildTreeNodeHierarchy(INode currentMegaNode, TreeNode currentTreeNode, Dictionary<string, INode> nodeDict) { // 获取当前节点的所有子节点 var childNodes = nodeDict.Values.Where(n => n.ParentId == currentMegaNode.Id); foreach (var child in childNodes) { var childTreeNode = new TreeNode(child.Name); // 如果是文件夹,继续递归构建其子节点;如果是文件,直接添加 if (child.Type == NodeType.Directory) { BuildTreeNodeHierarchy(child, childTreeNode, nodeDict); } currentTreeNode.Nodes.Add(childTreeNode); } }
关键说明
- 使用
using语句管理MegaApiClient,确保资源自动释放,替代手动Dispose - 通过
ToDictionary建立节点ID到节点的映射,高效查找父/子节点 - 递归方法
BuildTreeNodeHierarchy负责遍历每个文件夹的子节点,构建嵌套的TreeView结构 - 最后先清空原有节点,再添加完整的层级根节点,避免重复内容
内容的提问来源于stack exchange,提问作者JoseLo Ch H
相关产品推荐
相关产品推荐

