Tree View: эффективно переподчинить узел (поменять родителя)
От: voiger Украина  
Дата: 14.12.07 13:16
Оценка:
Здравствуйте!
Есть следующая проблема.
Имеется TreeView с огромным количеством узлов на разных уровнях. Класс узла — наследник от TreeNode со своими полями.

public class MyTreeNode: TreeNode
{
        public string myStringField;
        ...
}


Хочу сгруппировать узлы верхнего уровня по myStringField, перенести их целиком с потомками из корня дерева в новые узлы вот так

/*было*/
|-string1 node1
|-string1 node2
|-string2 node3
|-string1 node4
|-string2 node5

/*стало*/
-string1
  |-node1
  |-node2
  +-node4
-string2
  |-node3
  +-node5


Где stringN — значения полей myStringField,
каждый nodeN содержит кучу потомков.

Пробема в том, что если делать такую группировку, клонируя узлы, добавляя их в группирующий узел, и удаляя из корня дерева, получается очень медленно. А мне нужно, всего-то изменить ссылку на родительский узел! Но TreeNode.Parent — только для чтения
Как быть? Есть какой-то способ поменять эту самую ссылку (TreeNode.Paren)?
Спасибо!

/****Приложение :)****/
Вот, что я делаю:
private void GroupImplementations(TreeNodeCollection tnc)
{
 int i = 0;
 int j;
 if (null != tnc && tnc.Count > 0)
   while (i < tnc.Count-1 && !string.IsNullOrEmpty(((SostavTreeNode)tnc[i]).myStringField))
   {
     bool biRemove = false;
     MyTreeNode node_i = (MyTreeNode)tnc[i];
     j = i+1;
     while (j<tnc.Count)
     {
       MyTreeNode node_j = (MyTreeNode)tnc[j];
       if (node_i.myStringField == node_j.myStringField)
       {
         int index = GetIndexOfGroupingNode(tnc, node_i.myStringField);//ищет индекс узла в TreeNodeCollection, у которого node.Name==myStringField
         if (-1 == index) //создаём группирующий узел
         {
           MyTreeNode groupingNode = new MyTreeNode();
           groupingNode.Name = node_i.myStringField;
           groupingNode.Text = node_i.myStringField;
           groupingNode.Nodes.AddRange(new TreeNode[] { (MyTreeNode)node_i.Clone(), (MyTreeNode)node_j.Clone() }); //медленно! :(
           tnc.Add();
         }
         else //добавляем к уже существующему группирующему узлу
         {
           tnc[index].Nodes.Add((MyTreeNode)node_j.Clone()); //медленно! :(
         }
         node_j.Remove(); //медленно! :(
         biRemove = true;
       }
       else
         j++;
     }

     if (biRemove)
     {
       node_i.Remove(); //медленно! :(
       biRemove = false;
     }
     else
       i++;
   }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.