有没有一种方法可以做到这一点?
面板和表单类都有一个Controls集合属性,该属性具有Clear()方法...
MyPanel.Controls.Clear();
或者MyForm.Controls.Clear();
但是 Clear()
不会调用 dispose()
(它所做的仅仅是从集合中移除控件),因此你需要做的是
List<Control> ctrls = new List<Control>(MyPanel.Controls);
MyPanel.Controls.Clear();
foreach(Control c in ctrls )
c.Dispose();
你需要创建一个独立的引用列表,因为“Dispose”方法也会将控件从集合中移除,导致索引改变并且干扰了foreach循环...
您并没有提供太多详细信息。
这发生在窗体的Dispose重写方法中(在form.designer.cs文件中)。代码如下:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
我不相信有一种方法可以一次性地做到这一点。您只需迭代子控件并逐个调用它们的dispose方法:
foreach(var control in this.Controls)
{
control.Dispose();
}
foreach
循环会停止,因为this.Controls
集合已被修改。循环将提前退出,而不是所有控件都已被处理。 Control.Dispose()
在处理时会自动从其父级中删除该控件。 - jrh您没有说明这是ASP.Net还是Winforms。如果是后者,您可以通过在面板上首先调用SuspendLayout()
来做得足够好。然后,在完成时调用ResumeLayout()
。
foreach
循环中的c.Dispose();
之前添加MyPanel.Controls.Remove(c);
。 - Matt