如何一次性清除面板或窗体中的所有控件?C#

12
4个回答

35

面板和表单类都有一个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循环...


9
你也可以使用倒序循环,它不会弄乱索引 ;) - Louis Kottmann
提示:如果您不想删除所有控件,而是只想删除其中的一些控件,则可以在foreach循环中的c.Dispose();之前添加MyPanel.Controls.Remove(c); - Matt
1
释放一个面板将自动释放其集合中的所有控件。 :| - Dezv

4

您并没有提供太多详细信息。

这发生在窗体的Dispose重写方法中(在form.designer.cs文件中)。代码如下:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }

    base.Dispose(disposing);
}

3

我不相信有一种方法可以一次性地做到这一点。您只需迭代子控件并逐个调用它们的dispose方法:

foreach(var control in this.Controls)
{
   control.Dispose();
}

2
这种方法在Winforms中不起作用,因为foreach循环会停止,因为this.Controls集合已被修改。循环将提前退出,而不是所有控件都已被处理。 Control.Dispose()在处理时会自动从其父级中删除该控件 - jrh

0

您没有说明这是ASP.Net还是Winforms。如果是后者,您可以通过在面板上首先调用SuspendLayout()来做得足够好。然后,在完成时调用ResumeLayout()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接