0

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

public static class MyDataBase
{
    private static List<string> fields = new List<string>();

    public static void AddField(string field)
    {
        fields.Add(field);
    }

    public static IList<string> 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();
    }

谢谢

4

2 回答 2

1

我可以建议改进的第一个是使用 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<myTreeview.Nodes.Count)
{
        if (myTreeview.Nodes[j].Text == elements[i])
        {
               exits = true;
               parentNode = node;
        }
        j++;
}

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

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

于 2012-11-06T14:44:58.087 回答
1

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

public void ProcessPath(IEnumerable<String> path,  TreeNodeCollection nodes)
{
    if (!path.Any())
        return;
    var node = nodes.Cast<TreeNode>().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);
}

如果你真的有大量的行,你可能应该寻找一种解决方案,只在单击节点时加载子节点

于 2012-11-06T15:44:09.060 回答