2009-10-02 15 views

Respuesta

25

Tanto el Grupo y la clase de formulario tienen una propiedad de colección de controles, que tiene un método Clear() ...

MyPanel.Controls.Clear(); 

o

MyForm.Controls.Clear(); 

Pero Clear() no llama dispose() (Todo lo que hace es eliminar el control de la colección), entonces lo que tiene que hacer es

List<Control> ctrls = new List<Control>(MyPanel.Controls); 
    MyPanel.Controls.Clear(); 
    foreach(Control c in ctrls) 
     c.Dispose(); 

Necesita crear una lista separada de las referencias porque Dispose también eliminará el control de la colección, cambiando el índice y arruinando el foreach ...

+0

no se dio cuenta = P – Luiscencio

+6

También puede usar un ciclo inverso para el bucle, no estropeará los índices;) –

1

No creo que haya una manera de hacer esto de una vez. Usted sólo puede iterar a través de los controles secundarios y llamar a cada uno de sus métodos, preparan a la vez:

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

Este método no funciona en Winforms, el ciclo 'foreach' se detendrá porque se ha modificado la colección' this.Controls'. ** El ciclo se cerrará temprano y no todos los controles se habrán eliminado. ** ['Control.Dispose()' elimina el control de su elemento primario automáticamente cuando se elimina] (https://referencesource.microsoft.com/#System .Windows.Forms/winforms/Managed/System/WinForms/Control.cs, 5919). – jrh

1

Usted no da muchos detalles de por qué.

Esto ocurre en el método Suprimir anulación del formulario (en form.designer.cs). Se ve así:

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

    base.Dispose(disposing); 
} 
0

No compartió si se trataba de ASP.Net o Winforms. Si es lo último, puede hacerlo lo suficientemente bien llamando al SuspendLayout() en el panel. Luego, cuando haya terminado, llame al ResumeLayout().

Cuestiones relacionadas