Duplicar posibles:
Does Form.Dispose() call controls inside's Dispose()?¿Cómo elimino todos los controles en un panel o formulario a la VEZ? C#
hay una manera de hacer esto?
Duplicar posibles:
Does Form.Dispose() call controls inside's Dispose()?¿Cómo elimino todos los controles en un panel o formulario a la VEZ? C#
hay una manera de hacer esto?
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 ...
no se dio cuenta = P – Luiscencio
También puede usar un ciclo inverso para el bucle, no estropeará los índices;) –
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();
}
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
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);
}
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()
.
WebForms o WinForms? – jrummell