ForEach TreeNode.Nodes вытягивает нулевой узел - PullRequest
3 голосов
/ 02 февраля 2012

У меня есть два рекурсивных метода, которые предназначены для проверки / снятия отметки всех TreeNodes в .NET TreeView Методы очень просты:

private void SetAllNodes(TreeNode rootNode, bool value)
{
    rootNode.Checked = value;
    foreach (TreeNode node in rootNode.Nodes)
        SetAllNodes(node, value);
}

private void SetAllNodes(TreeView root, bool value)
{
    foreach (TreeNode node in root.Nodes)
        SetAllNodes(node, value);
}

Я называю это так:

SetAllNodes(this.myTreeView, true);

В любом случае, какое-то время это работало нормально, но внезапно я получил null reference exception.После некоторой отладки я заметил, что во время цикла foreach функции second примерно на второй итерации возвращается null TreeNode.

Еще более странно,если я заменю цикл foreach следующим кодом, ошибка исчезнет:

for (int i = 0; i < root.Nodes.Count; i++)
{
   TreeNode node = root.Nodes[i];
   SetAllNodes(node, value);
}

Есть идеи, почему это происходит?Я отладил столько, сколько смог, но простой факт заключается в том, что я получаю элемент null из моего цикла foreach.

Edit По запросу, воттрассировка стека:

MyProgram.exe!MyProgram.UI.frmFilter.SetAllNodes(System.Windows.Forms.TreeNode rootNode = null, bool value = false) Line 457 + 0x7 bytes    C#
MyProgram.exe!MyProgram.UI.frmFilter.SetAllNodes(System.Windows.Forms.TreeView root = {System.Windows.Forms.TreeView}, bool value = false) Line 450 + 0x6a bytes    C#
MyProgram.exe!MyProgram.UI.frmFilter.btnNone_Click(object sender = {Text = "None"}, System.EventArgs e = {X = 36 Y = 5 Button = Left}) Line 604 C#
[External Code] 
MyProgram.exe!MyProgram.Program.Main(string[] args = {string[0]}) Line 33 + 0x1d bytes  C#
[External Code]

1 Ответ

1 голос
/ 11 августа 2014

Я бы предположил, что rootNode.Checked = value меняет структуру внутренней коллекции, поэтому перечислитель (foreach) каким-то образом возвращает ссылку на перемещенный узел.В идеале InvalidOperationException должен создаваться с сообщением «коллекция была изменена».Без лучшего понимания того, что делает установщик свойства Checked, использование цикла for, вероятно, является хорошим решением.

...