如何使用保存在数据库中的文件路径填充树视图

假设我已在数据库中保存文件路径。 现在我想通过treeview显示那些文件路径。 我发现一个样本工作正常,但不知道什么时候数据库中会有大量数据,那么树视图填充将会挂起或花费太长时间。 我在这里给出代码。 请检查并告知哪些可以纠正,因此当db中存在大量数据时性能会很好。

public static class MyDataBase { private static List fields = new List(); public static void AddField(string field) { fields.Add(field); } public static IList FieldsInMyColumn() { return fields; } } public void CreateTreeView() { foreach (string field in MyDataBase.FieldsInMyColumn()) { string[] elements = field.Split('\\'); TreeNode parentNode = null; for (int i = 0; i < elements.Length - 1; ++i) { if (parentNode == null) { bool exits = false; foreach (TreeNode node in myTreeview.Nodes) { if (node.Text == elements[i]) { exits = true; parentNode = node; } } if (!exits) { TreeNode childNode = new TreeNode(elements[i]); myTreeview.Nodes.Add(childNode); parentNode = childNode; } } else { bool exits = false; foreach (TreeNode node in parentNode.Nodes) { if (node.Text == elements[i]) { exits = true; parentNode = node; } } if (!exits) { TreeNode childNode = new TreeNode(elements[i]); parentNode.Nodes.Add(childNode); parentNode = childNode; } } } if (parentNode != null) { parentNode.Nodes.Add(elements[elements.Length - 1]); } } } private void button1_Click(object sender, EventArgs e) { MyDataBase.AddField(@"c:\jsmith\project1\hello.cs"); MyDataBase.AddField(@"c:\jsmith\project1\what.cs"); MyDataBase.AddField(@"c:\jsmith\project2\hello.cs"); MyDataBase.AddField(@"c:\jsmith\project1\tdp.cs"); MyDataBase.AddField(@"c:\jsmith\project2\ship.cs"); MyDataBase.AddField(@"d:\jsmith\project1\hello404.cs"); MyDataBase.AddField(@"c:\jsmith1\project2\ship.cs"); CreateTreeView(); } 

谢谢

根据您的框架版本,也许您可​​以尝试这样的事情:

 public void ProcessPath(IEnumerable path, TreeNodeCollection nodes) { if (!path.Any()) return; var node = nodes.Cast().FirstOrDefault(n => n.Text == path.First()); if (node == null) { node = new TreeNode(text: path.First()); nodes.Add(node); } ProcessPath(path.Skip(1),node.ChildNodes); } public void CreateTreeView() { foreach (string field in MyDataBase.FieldsInMyColumn()) ProcessPath(field.Split('\\'),myTreeView.Nodes); } 

如果您确实拥有大量行,则应该寻找一种解决方案,您只需在单击节点时加载子节点

我建议改进的第一个是使用while而不是foreach:

而不是在这两个地方:

 bool exits = false; foreach (TreeNode node in myTreeview.Nodes) { if (node.Text == elements[i]) { exits = true; parentNode = node; } } 

您可以使用

 bool exits = false; int j = 0; while (!exits && j 

这样您就不需要遍历整个Nodes集合,循环将在找到父节点后完成。 当然,在没有节点标题元素[i]的情况下,您将浏览整个集合。

PS我认为你的意思是exists而不是exits