2013-12-03 8 views
0

У меня проблема с добавлением дочернего узла к определенному узлу. Вот мой код: Метод окраски дереваДобавление дочернего узла к определенному узлу в C#

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; 
    } 

Я могу добавить один дочерний узел в обоих узлах, но когда я пытаюсь добавить другой, я получаю переполнение стека исключение .. Пожалуйста, помогите, спасибо

ответ

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; 
} 
+0

Спасибо за ответ. Отредактировал мой код, похожий на этот, все тот же исключение переполнения стека. Любое другое решение? – user3061057

+0

@ user3061057 Я не уверен, как именно вы его пробовали, похоже, у вас очень много узлов? поэтому использование ** рекурсивного метода ** не будет работать из-за ограничения в размере стека вызовов. Попробуйте использовать обновленный код **, но **, я думаю, вы должны рассмотреть ответ *** Prahlad Yeri *** с использованием метода TreeNodeCollection.Find, это очень удобно. –

1

Если проблема просто найти имя узла, вы можете использовать встроенный метод TreeNodeCollection.Find() для лучшей производительности:

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

Пример:

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

Второй параметр указывает, что вы хотите искать во всех узлах рекурсивно.

Кроме того, это возвращает весь массив TreeNode [], а не один узел. Таким образом, вам нужно зациклиться на них, чтобы заполнить или взять элемент node [0], если вы хотите использовать только первый.

Смежные вопросы