C#Not Disposing控件就像我告诉它的那样

时间:2009-09-29 15:28:12

标签: c# winforms foreach dispose

我有一个Panel控件。在面板内部,用户可以添加组合框,文本框的标签等并拖动它们,并且我的表单上有一个删除按钮,如果他们点击它,它将删除该面板内的所有控件。但是这段代码:

foreach( Control control in panel.Controls )
{
     control.Dispose();
}

......不能正常工作。它并不总是处理面板内的所有控件。有时它会消除掉它们中的大多数,有时它只能摆脱一两个。有时除了1以外都是处理。 WTF?

修改

<小时/> 以下是我用于将控件添加到Panel的代码:

button1_Click(object sender, EventArgs e)
{
    TextBox tbox = new TextBox();
    tbox.Multiline = true;
    tbox.IsAccessible = true;

    panel.Controls.Add(tbox);
}

4 个答案:

答案 0 :(得分:8)

Dispose()只清理非托管资源(尽管Paul Williams在评论中指出它通常比这更复杂!)所以它可能会或可能不会对你的情况做任何有用的事情。

尝试使用RemoveAt(i)方法删除控件,而不是Dispose()

for(int i = panel.Controls.Count-1; i >= 0; i--)
{
    panel.Controls.RemoveAt(i);
}

答案 1 :(得分:7)

删除所有控件的简单方法是执行此操作:

panel.Controls.Clear();

编辑:感谢Pieter和Paolo,只是调用Clear()这样会泄漏内存,因为没有处理控件,所以这不是一个好习惯。

答案 2 :(得分:3)

之前我已经看到过这种情况,您正在从集合中删除使集合本身变小的项目。 例如,当你向下移动时,如果集合中有5个项目,你会比你期望的更早到达列表的末尾,因为你发出的每个Dispose()都会使列表变小。

答案 3 :(得分:0)

我知道这是一个很老的帖子,但我希望可以帮助别人。

我找到的唯一方法是:

while(panel.Controls.Count > 0)
{
    panel.Controls[0].Dispose();
}

这样,如果控件列表在循环中间变小,则无关紧要。