2013-06-19 34 views
1

我想刪除所有動態創建的對象[在這種情況下,標籤和trackbars]C#中刪除動態創建的對象

foreach (Label Labels in Controls.OfType<Label>()) 
{ 
    if (Labels.Tag.ToString() != "non-disposal"){ 
     Labels.Dispose(); 
    } 
} 

我想這一點,但我得到一個錯誤說「對象引用不設置到一個對象的實例 「

謝謝你,

解決方案:

foreach (Label label in Controls.OfType<Label>()){ 

if (label.Tag != null && label.Tag.ToString() == "dynamic") 
    label.Dispose(); 

感謝lazyberezovsky

+4

爲什麼不給你的動態創建的對象一些特定的標籤?或者在創建它們時將它們添加到某個集合中? –

+3

爲什麼它會刪除所有標籤?大概你有「不處理」設置爲你想保留的那些「標籤」? –

+0

@JonSkeet我之前嘗試過,我得到一個錯誤,說「對象引用未設置爲對象的實例」。 – user1859829

回答

4

將所有動態控件添加到一些Tag,例如, "dynamic"。然後處理掉這樣:

foreach (Label label in Controls.OfType<Label>()) 
{ 
    if (label.Tag != null && label.Tag.ToString() == "dynamic") 
     label.Dispose();  
} 

看起來有些標籤沒有Tag分配。這就是爲什麼你有一個例外,試圖撥打ToString()null

+2

你打敗了我。無論如何,你有投票權。 – Nair

+0

@Nair謝謝:) –

+1

@ user1859829僅適用於您要處置的每個動態標籤 –

1

您需要將它們從控件集合中刪除。

var toDelete = Controls.OfType<Label>() 
       .Where(c => (c.Tag ?? "").ToString() != "non-disposal") 
       .ToList(); //need a list or array to avoid changing the collection as we remove from it 
foreach (var ctrl in toDelete) 
{ 
    Controls.Remove(ctrl); 
    ctrl.Dispose(); 
} 
//if this is part of a long method, also clear the list right away 
// so the garbage collector can see them 
toDelete.Clear(); 
+0

我仍然收到錯誤說「對象引用未設置爲對象的實例」。任何解決方案 – user1859829

+0

我想我會看到空引用的位置。看起來你已經有了另一種解決方法,但現在也應該可以工作。 –