C # Treeview - Генерация дерева без дубликатов с количеством узлов - PullRequest
1 голос
/ 05 апреля 2011

Уже есть некоторый код, который почти у цели и нуждается в некоторых окончательных настройках.

Вот мой ожидаемый результат:

ParentNode1
|----ChildNode1 (3)
|----ChildNode2 (2)
|----ChildNode3
ParentNode2
|----ChildNode4 (2)
|----ChildNode5

Узел, что у дочерних узлов 3 и 5 есть только одна "запись", из которой я извлекаю свои данные (строка данных).

 dr["Contact"] = drows_cont[0].ItemArray[2].ToString();                                        
 TreeNode temp = new TreeNode();
 temp.Text = (dr["Contact"].ToString());
 temp.Name = temp.Text;           
 if(contactNode1.Nodes.Count == 0)/*node has no children or is null*/
 {
     contactNode1.Nodes.Add(temp);
 }
 else
 {
      int index = 1;
      foreach(TreeNode loopNode in contactNode1.Nodes)
      {                                                                   
           index = 1;
               for(int i=0; i < contactNode1.Nodes.Count; i++)
               {
                   if(contactNode1.Nodes[i].Name == temp.Name) //if match found
                   {                                                                  
                        index = contactNode1.GetNodeCount(false);
                        contactNode1.Nodes[i].Text = (dr["Contact"].ToString()) + " " + index;
                   }
               }
               if (index <= 1)
               {                                                        
                   contactNode1.Nodes.Add(temp); //AddToList
                   break;
               }
        }
  }

Чтобы прояснить мою логику выше, если родительский узел имеет значение Null, он добавит 1 дочерний узел (временный узел).

С этого момента он всегда попадает в остальное. Я новичок в Foreach, так как Loopnode никогда не используется: \

Команда for (в foreach) используется для сравнения временного узла с каждым узлом в списке, и, если найден дублирующий узел, он изменит имя с «ChildNode4» на «ChildNode4 (2)», добавив 1 для каждого найден дубликат (например, от "ChildNode4 (2)" до "ChildNode4 (3)" и т. д.)

Если дубликат не найден в цикле For, индекс не изменяется и, таким образом, попадает в финал if и добавляет его в родительский узел.

Может ли кто-нибудь указать мне правильное направление? Возможно, мне нужно исправить свой Foreach, или я неправильно использую свой GetNodeCount (пока он всегда возвращает 0).

Редактировать: Начиная с кода, который я разместил, я всегда получу: ChildNode3 (0) вместо действительного числа. Каким-то образом мне нужно, чтобы GetNodeCount фактически отражал количество ChildNode3s, фактически не показывая все ChildNode3s

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011
//Add parent
treeView.Nodes.Add(parentNode);
//Loop through every child
foreach(TreeNode childNode in parentNode.Nodes)
{
    int index = 0;
    //Calculate childNode's children
    foreach (TreeNode node in loopNode.Nodes)
    {
        index++;
    }
    string node;
    //If index is 0, dont change text.
    if (index != 0) node = childNode.Text + " (" + index + ")";
    else node = childNode.Text;
    parentNode.Nodes.Add(childNode);
}

Изменить при необходимости.Вы можете сделать это методом, передав в качестве аргумента родительский узел.

0 голосов
/ 05 апреля 2011

Я предлагаю вам заменить код в:

index = contactNode1.GetNodeCount(false);

на

index = contactNode1.Nodes.Count(); //start from 0

или

index = contactNode1.Nodes.Count() + 1; // start from 1

Если это не отвечает на ваш вопрос, пожалуйста, не могли бы выопубликуйте фактический результат, чтобы мы могли понять, в чем проблема

...