JanardhanSharma Ответов: 2

Как решить исключение: коллекция была изменена; операция перечисления может не выполняться


Как решить исключение: коллекция была изменена; операция перечисления может не выполняться

Здесь итерации работают нормально, но тем временем я хочу удалить эти дочерние узлы.. могу ли я знать, как я могу ?

private void PrintRecursive(TreeNode treeNode, TreeView treeviewtemp2)
   {

      // (level-2 TreeNodes)
       int x = 0;
       foreach (TreeNode n in treeNode.ChildNodes)
       {
          

           var nodeName = n.Text;
           var nodeValue = n.Value;

           treeviewtemp2.Nodes[0].ChildNodes[x].ChildNodes.Remove(n);
           x++;

       }

   }


Заранее спасибо

2 Ответов

Рейтинг:
12

Sergey Alexandrovich Kryukov

Не изменяйте коллекцию во время обхода ее с помощью "foreachСобственно, это и не очень нужно. Например, можно создать список ссылок на удаляемые элементы и удалить их все в отдельном цикле. Кстати, такое ограничение не распространяется на "for- петля, но ты должен быть очень осторожен. Например, один из обычных методов заключается в том, чтобы пройти коллекцию в обратном порядке, если вы собираетесь удалить некоторые элементы. (Нужно ли вообще объяснять, почему? Это действительно простая логика.)

У вашего кода действительно есть проблемы, так что этот дурак-проф.Чистая функция действительно помогает вам. Прежде всего, когда вы берете какой-то индекс ([0], [x], n) вы должны убедиться, что элемент в этом индексе действительно существует.

Я оставлю переписывать ваш код для ваших домашних упражнений. Очень важно научиться решать такие маленькие проблемы самостоятельно.

(Еще один намек: если вы хотите использовать "for", вычислить количество и сохранить его в какой-то локальной переменной перед циклом. Опять же, я надеюсь, что мне не нужно объяснять, почему.)

—СА


CPallini

5.

Sergey Alexandrovich Kryukov

Спасибо, Карло.
—СА

Рейтинг:
1

ali khan

I fix the problematic code with some changes. This problem often occurs in control collections. I was puzzled by it when trying to remove nodes from a TreeView control.



List<TreeNode> treeList = new List<TreeNode>();
        foreach (TreeNode treeNode in treeViewFolderMove.Nodes)
        {
            treeList.Add(treeNode);
        }
        foreach (TreeNode treeNode in treeList)
        {
            if (treeNode.Value == Value)
            {
                this.treeViewFolderMove.Nodes.Remove(treeNode);
            }
        }