2015-12-27 5 views
2

У меня есть следующие функции для удаления конкретных узлов из элемента управления представлением в виде дереваNull исключения при удалении дочернего узла из просмотра дерева узла

private void PruneTree(TreeNode tn) 
{   
    foreach (TreeNode item in tn.Nodes) 
    {       
     PruneTree(item);    
    } 
    if (tn.BackColor == Color.LightCoral && tn.Nodes.Count == 0) 
    { 
     tn.Remove(); 
    } 
} 

я зову его на TreeView корневого узла, но он бросает NullReferenceException для tn по адресу tn.Nodes.

Я не ожидаю нулевого элемента, потому что я повторяю дочерние узлы узла и, конечно, они не могут быть нулевыми.

В чем может быть проблема, я думаю, когда я удаляю некоторые узлы из дерева, это влияет на функцию.

+3

@dotctor Я знаю, что такое исключение, но как это могло произойти в этом коде! – Ahmad

ответ

4

Когда вы удаляете предметы, вы разбиваете перечисление.

Чтобы предотвратить это, цикл в обратном порядке, как это:

for(int i = tn.Nodes.Count - 1 ; i >= 0 ; i--) 
{ 
    TreeNode item = tn.Nodes[i]; 
    //.... 
} 

Это гарантирует, что вы удалить элементы с более высокими показателями первого, так что перечисление не сломается.

+0

Спасибо, я изменил свой вопрос, и решение снова является вашим ответом, даже если я удаляю элементы рекурсивно вне цикла. (но петля косвенно выполняет удаление. – Ahmad

+0

@ Ахмад, пожалуйста. Я не уверен, что понимаю последнюю часть вашего комментария. –

+0

извините за мой английский, я имею в виду, что мы обычно видим такую ​​ошибку и решение, когда мы непосредственно удаляем элемент в цикле, но мой код делает это косвенно (он вызывает себя рекурсивно и внутри функции я удаляю данный элемент). Но в любом случае решение остается тем же. – Ahmad

Смежные вопросы