将子节点添加到c#中的特定节点

时间:2013-12-03 10:53:22

标签: c# .net treeview

我在将childnode添加到特定节点时遇到问题。这是我的代码: 绘画树的方法

public void paint()
    {
        treeView1.Nodes.Clear();
        TreeNode root = new TreeNode("Katalogas");  
        root.Name = "root";  
        treeView1.Nodes.Add(root);



        foreach (string or in categories)
        {
            TreeNode subcat = new TreeNode(or);
            subcat.Name = or;
            root.Nodes.Add(subcat);
        }

        foreach (Preke or in PrekiuListas)
        {
            TreeNode subcat = new TreeNode(or.name);
            subcat.Name = or.name;
            TreeNode temp = FindNode(or.category);
            temp.Nodes.Add(subcat);
        }

查找节点的方法

private TreeNode FindNode(String name)
    {
        foreach (TreeNode node in treeView1.Nodes[0].Nodes)
        {
            if (node.Nodes.Count > 0)
                return FindNode(name);
            if (node.Name == name)
                return node;
        }
        return null;
    }

我可以向两个节点添加一个子节点,但是当我尝试添加另一个节点时,我会收到堆栈溢出异常..请帮忙,谢谢

2 个答案:

答案 0 :(得分:1)

您必须传递根节点以及方法:

private TreeNode FindNode(String name, TreeNode root)
{
    if(root.Name == name) return root;
    Stack<TreeNode> nodes = new Stack<TreeNode>();
    nodes.Push(root);
    while(nodes.Count > 0)
    {
        var node = nodes.Pop();
        foreach(TreeNode n in node.Nodes){
           if (n.Name == name) return n;
           nodes.Push(n);
        }
    }
    return null;
}
//Usage
var node = FindNode(someName, treeView1.Nodes[0]);
//if your treeView has more root nodes, you have to loop through them
TreeNode node = null;
foreach(TreeNode node in treeView1.Nodes){
  node = FindNode(someName, node);
  if(node != null) break;
}

答案 1 :(得分:1)

如果问题只是找到节点名称,您可以使用内置的TreeNodeCollection.Find()方法来获得更好的性能:

public TreeNode[] Find(string key, bool searchAllChildren);

示例:

n.Nodes.Find("name", true);

第二个参数表示您希望以递归方式搜索所有节点。

此外,这将返回整个TreeNode []数组,而不是单个节点。因此,如果您只想使用第一个元素,则必须循环填充或获取node [0]元素。