2015-12-27 64 views
2

我有以下函數從樹視圖控件空例外

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

我把它叫做一個樹形根節點刪除特定的節點,但它拋出NullReferenceExceptiontntn.Nodes

我不期望空項目,因爲我迭代節點的子節點,當然他們不能爲空。

可能是什麼問題,我認爲當我從樹中刪除一些節點時,它會影響函數。

+3

@dotctor我知道什麼是空的異常,但它怎麼會出現在這個代碼! – Ahmad

回答

4

當你刪除項目時,你打破了枚舉。

爲了防止這種情況發生,循環以相反的順序是這樣的:

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

這可以確保您刪除具有較高的索引第一項,所以在枚舉不會打破。

+0

謝謝,我修改了我的問題,並且解決方案也是您的答案,即使我在循環外遞歸刪除項目。 (但是這個循環間接執行刪除 – Ahmad

+0

@Ahmad,不客氣,我不確定我是否理解你評論的最後部分 –

+0

對不起我的英文,我的意思是我們通常在直接刪除時看到這樣的錯誤和解決方案一個項目在一個循環中,但我的代碼間接做它(它會自動遞歸地調用它,並在函數內部移除給定的項目),但無論如何,解決方案是相同的。 – Ahmad