我想删除所有动态创建的对象[在本例中为标签和轨道栏]
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
答案 0 :(得分:4)
向所有动态控件添加一些Tag
,例如"dynamic"
。然后以这种方式处理它们:
foreach (Label label in Controls.OfType<Label>())
{
if (label.Tag != null && label.Tag.ToString() == "dynamic")
label.Dispose();
}
看起来某个标签没有分配Tag
。这就是为什么你试图在ToString()
上拨打null
时遇到异常。
答案 1 :(得分: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();