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

jay*_*t55 1 c# foreach dispose winforms

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

foreach( Control control in panel.Controls )
{
     control.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:


这是我用来向Panel添加控件的代码:

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

    panel.Controls.Add(tbox);
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ert 8

Dispose() 只清理非托管资源(虽然保罗威廉姆斯在评论中指出它通常比这更复杂!)因此它可能会或可能不会对你的情况做任何有用的事情.

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

for(int i = panel.Controls.Count-1; i >= 0; i--)
{
    panel.Controls.RemoveAt(i);
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果要将它们全部删除,可以使用panel.Controls.Clear().如有必要,Control.ControlCollection将负责清理. (6认同)

Mus*_*sis 7

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

panel.Controls.Clear();
Run Code Online (Sandbox Code Playgroud)

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

  • @MusiGenesis [MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx)明确表示:调用`Clear`方法不会删除控制句柄从记忆里.**您必须显式调用`Dispose`方法以避免内存泄漏**. (3认同)