无法正确捕获文件路径:TreeView节点filepath字段赋值修正
问题
我用以下代码按"/"拆分文件路径生成TreeView列表,但拆分时每个节点的filepath字段被赋值为完整路径,而非节点对应的实际路径,该怎么修改?
当前生成的节点(错误示例):
/download/b/a Loop-1;SubItem = new Treeview() { name = download Level = 2, filepath = /download/b/a, SubItems = new List<Treeview>() }; Loop-2;subItem = new Treeview() { name = b, Level = 2, filepath = /download/b/a, SubItems = new List<Treeview>() };
期望修改后的节点(正确示例):
Loop-1;subItem = new Treeview() { name = download Level = 2, filepath = /download, SubItems = new List<Treeview>() }; Loop-2;subItem = new Treeview() { name = b, Level = 2, filepath = /download/b, SubItems = new List<Treeview>() };
现有代码:
private void FilePath(System.Windows.Controls.TreeView treeView, IEnumerable<string> paths, char pathSeparator) { List<Treeview> sourceCollection = new List<Treeview>(); foreach (string path in paths) { string[] fileItems = path.Split(pathSeparator); if (fileItems.Any()) { Treeview root = sourceCollection.FirstOrDefault(x => x.Name.Equals(fileItems[0]) && x.Level.Equals(1)); if (root == null) { root = new Treeview() { Level = 1, Name = fileItems[0], filepath = path, SubItems = new List<Treeview>() }; sourceCollection.Add(root); } // if if (fileItems.Length > 1) { Treeview parentItem = root; int level = 2; for (int i = 1; i < fileItems.Length; ++i) { Treeview subItem = parentItem.SubItems.FirstOrDefault(x => x.Name.Equals(fileItems[i]) && x.Level.Equals(level)); if (subItem == null) { subItem = new Treeview() { Name = fileItems[i], Level = level, filepath = path, SubItems = new List<Treeview> }; parentItem.SubItems.Add(subItem); } // if parentItem = subItem; level++; } // for } // if } // if } // foreach TreeView.ItemsSource = sourceCollection; } // void
解决方案
核心思路是:不再直接将完整路径赋值给filepath,而是根据当前节点的层级,拼接出从根节点到当前节点的专属路径。
修改后的完整代码
private void FilePath(System.Windows.Controls.TreeView treeView, IEnumerable<string> paths, char pathSeparator) { List<Treeview> sourceCollection = new List<Treeview>(); foreach (string path in paths) { string[] fileItems = path.Split(pathSeparator); if (fileItems.Any()) { // 处理根节点 Treeview root = sourceCollection.FirstOrDefault(x => x.Name.Equals(fileItems[0]) && x.Level.Equals(1)); if (root == null) { // 拼接根节点自身的路径 string rootPath = pathSeparator + fileItems[0]; root = new Treeview() { Level = 1, Name = fileItems[0], filepath = rootPath, SubItems = new List<Treeview>() }; sourceCollection.Add(root); } if (fileItems.Length > 1) { Treeview parentItem = root; int level = 2; // 维护当前已拼接的路径,从根节点路径开始 string currentPath = parentItem.filepath; for (int i = 1; i < fileItems.Length; ++i) { Treeview subItem = parentItem.SubItems.FirstOrDefault(x => x.Name.Equals(fileItems[i]) && x.Level.Equals(level)); if (subItem == null) { // 拼接当前节点的路径 currentPath = string.Concat(currentPath, pathSeparator, fileItems[i]); subItem = new Treeview() { Name = fileItems[i], Level = level, filepath = currentPath, SubItems = new List<Treeview>() }; parentItem.SubItems.Add(subItem); } else { // 节点已存在时,复用其路径作为后续拼接的基础 currentPath = subItem.filepath; } parentItem = subItem; level++; } } } } treeView.ItemsSource = sourceCollection; }
关键修改点
- 根节点路径重构:创建根节点时,不再使用完整路径,而是拼接出根节点自身的专属路径(如
/download)。 - 子节点路径动态拼接:循环处理子节点时,维护
currentPath变量,每次迭代拼接当前节点名称,生成对应路径赋值给filepath。 - 已存在节点的路径复用:如果子节点已存在,直接使用该节点的
filepath作为后续拼接的基础,避免路径重复拼接错误。
内容的提问来源于stack exchange,提问作者herakless
相关产品推荐
相关产品推荐

