2014-02-10 55 views
1

我試圖在不知道父項的情況下動態刪除控件。 但我在調試時不斷收到mscorlib.dll中的「System.NullReferenceException」。從不同父母的列表中刪除控件

我的代碼:

//Delete Controls 
     List<PictureBox> toDelete = severalControlsFromDifferentPanels; 
     for (int i = toDelete.Count - 1; i >= 0; --i) 
     { 
      Control parent = toDelete[i].Parent; 
      parent.Controls.Remove(toDelete[i]); 
     } 

缺少什麼我在這裏? 我在監督一些顯而易見的事情嗎? 在此先感謝!

+0

你是不是仍然指代你的代碼中某個被刪除的對象? – MCollard

+1

你從哪裏得到'severalControlsFromDifferetPanels',從一個方法?你確定所有的控件都有父類? –

回答

2

檢查的PictureBox有家長訪問之前:

foreach(PictureBox pictureBox in toDelete) 
    if (pictureBox.Parent != null) 
     pictureBox.Parent.Controls.Remove(pictureBox); 

爲了使代碼更可讀,你可以創建擴展方法:

public static void RemoveFromParent(this Control control) 
{ 
    if (control == null) 
     throw new ArgumentNullException(); 

    if (control.Parent == null) 
     return; 

    control.Parent.Controls.Remove(control); 
} 

從而消除管制的樣子:

foreach(PictureBox pictureBox in toDelete) 
    pictureBox.RemoveFromParent(); 
+0

與OP的代碼有什麼不同? =) –

+0

@ Selman22更可讀:) –

+0

我同意但可讀性無法修復錯誤:) –

0

東西是null;試圖訪問空對象上的屬性或方法將拋出該異常。

在第一行放置一個斷點並遍歷代碼。

List<PictureBox> toDelete = severalControlsFromDifferetPanels; 

// if severalControlsFromDifferetPanels is null, then toDelete.Count will throw 
for (int i = toDelete.Count - 1; i >= 0; --i) 
{ 
    // if toDelete[i] is null, then accessing .Parent will throw 
    Control parent = toDelete[i].Parent; 

    // if parent is null, then .Controls will throw 
    parent.Controls.Remove(toDelete[i]); 
} 

我們無法從您提供的代碼中知道更多。

+0

如果'parent'不爲null,如果'parent.Controls'不能爲空:) –

+0

@ Selman22你說得對,修正了。 :)「getter」有'if(controlCollection == null){controlCollection = new Control.ControlCollection(this)}' –