如何在ONCE ???中处理面板或表格中的所有控件? C#

时间:2009-10-02 18:11:31

标签: c# controls dispose

  

可能重复:
  Does Form.Dispose() call controls inside's Dispose()?

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:30)

Panel和Form类都有一个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 ......

答案 1 :(得分:3)

我不相信有一种方法可以同时做到这一点。您可以遍历子控件并一次调用一个dispose方法:

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

答案 2 :(得分:2)

你没有详细说明原因。

这发生在表单的Dispose重写方法中(在form.designer.cs中)。它看起来像这样:

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

    base.Dispose(disposing);
}

答案 3 :(得分:0)

如果这是ASP.Net或Winforms,你没有分享。如果是后者,您可以通过首先在面板上调用SuspendLayout()来做得很好。然后,完成后,请致电ResumeLayout()