#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);
}
Измените по мере необходимости. Вы можете сделать это методом, передав родительский узел в качестве аргумента.