代码之家  ›  专栏  ›  技术社区  ›  Luiscencio

如何一次性处理面板或窗体中的所有控件????C [重复]

  •  8
  • Luiscencio  · 技术社区  · 15 年前

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

    有办法吗?

    4 回复  |  直到 12 年前
        1
  •  28
  •   Charles Bretana    13 年前

    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…

        2
  •  3
  •   scottm    15 年前

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

    foreach(var control in this.Controls)
    {
       control.Dispose();
    }
    
        3
  •  2
  •   Steven Evers    15 年前

    你不知道为什么。

    这发生在窗体的Dispose重写方法中(在Form.Designer.cs中)。看起来是这样的:

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
    
        base.Dispose(disposing);
    }
    
        4
  •  0
  •   Himanshu THE ONLY ONE    12 年前

    如果这是ASP.NET或WinForms,则不会共享。如果是后者,你可以先打个电话就行了 SuspendLayout() 在面板上。然后,完成后,打电话给 ResumeLayout() .