我在将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;
}
我可以向两个节点添加一个子节点,但是当我尝试添加另一个节点时,我会收到堆栈溢出异常..请帮忙,谢谢
答案 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]元素。