2013-06-19 4 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 thanks :) –

+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

Я думаю, я вижу, где была нулевая ссылка. Похоже, у вас уже есть другая работа, но это тоже должно работать. –

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