C # Treeview — генерировать дерево без дубликатов с количеством узлов

#c# #treeview #duplicates #nodes

#c# #просмотр дерева #дубликаты #узлы

Вопрос:

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

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

 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 дочерний узел (временный узел).

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

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

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

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

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

Спасибо!

Комментарии:

1. Не совсем ясно, с какой проблемой вы столкнулись. Не могли бы вы уточнить, на какой вопрос вам нужен ответ?

2. Я предлагаю сказать, что не так с вашим кодом?

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

Ответ №1:

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

 index = contactNode1.GetNodeCount(false);
  

с

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

или

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

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

Ответ №2:

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

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