1

我想删除所有动态创建的对象 [在这种情况下,标签和轨迹栏]

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

2 回答 2

4

向所有动态控件添加一些Tag,例如"dynamic"。然后以这种方式处理它们:

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

看起来有些标签没有Tag分配。这就是为什么您在尝试调用ToString()时遇到异常的原因null

于 2013-06-19T14:00:27.020 回答
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(); 
于 2013-06-19T13:59:47.283 回答