Как создавать вложенные циклы в TreeNode C#

#c#

#c#

Вопрос:

Я написал вложенный цикл для добавления узлов дерева, проблема в том, что индекс i никогда не увеличивается до 1.

В для каждого цикла: там, где в первом родительском узле больше нет дочерних узлов, цикл останавливается в индексе j и не возвращается к индексу i для увеличения до 1.

 for (int i = 0; i < 23; i  )
{
    for (int j = 0; j < 23; j  )
    {
        foreach (var item in myDictionaryReconstructed)
        {
            if ("TreeNode: "   item.Key == treeView1.Nodes[i].Nodes[j].ToString())
            {
                treeView1.Nodes[i].Nodes[j].Nodes.Add(item.Value);
                treeView1.ExpandAll();
            }
        } 
    } 
}
  

Например:

Родительский узел 1 — подузел 1 — Подузел 2 — Подузел 3

Родительский узел 2 — подузел 1 —

Родительский узел 3 — подузел 1

Программа выполняется до родительского узла — 1 и подузла 3. Когда проверяется подузел 4, и он не найден, программа просто останавливается там, вместо того, чтобы переходить к следующему родительскому узлу.

Исключение: указанный аргумент находился вне диапазона допустимых значений индекса имени параметра.

Ответ на дубликат: после обсуждения позже я нашел исключение выше, мой вопрос был опубликован ранее, прежде чем я не знал, что это исключение индекса.

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

1. можете ли вы предоставить какой-либо вывод или что-то еще, что может помочь?

2. Что-то в этом не так. Вы уверены, что внутренние циклы действительно завершены?

3. Как вы пришли к такому выводу? Во время отладки? Было бы полезно, если бы вы предоставили примерную структуру Tree и элементы внутри myDictionaryReconstructed . Кроме того, вы уверены, что у вас нет какого-либо исключения?

4. У вас действительно есть 22 узла, и у каждого есть 22 подузла? Если нет, вы получите исключение

5. @OfirWinegarten У меня 22 узла, и у каждого узла есть 2-3 подузла.

Ответ №1:

Согласно нашему обсуждению в комментариях выше,

Следующий код выдает ArgumentOutOfRangeException

 treeView1.Nodes[i].Nodes[j]
  

Когда i или j больше, чем количество узлов, которые у вас на самом деле есть, возникает исключение, как это было бы с любым другим массивом.

Вы могли бы сделать это с foreach помощью или вместо использования магического числа (23) Nodes.Count .

Итак, ваш код может выглядеть следующим образом:

 for (int i = 0; i < treeView1.Nodes.Count; i  )
{
    for (int j = 0; j < treeView1.Nodes[i].Nodes.Count; j  )
    {
        foreach (var item in myDictionaryReconstructed)
        {
            if ("TreeNode: "   item.Key == treeView1.Nodes[i].Nodes[j].ToString())
            {
                treeView1.Nodes[i].Nodes[j].Nodes.Add(item.Value);
                treeView1.ExpandAll();
            }
        } 
    } 
}