Eventuali duplicati:
Does Form.Dispose() call controls inside's Dispose()?Come si eliminano tutti i controlli in un pannello o modulo in UNA VOLTA ??? C#
c'è un modo per fare questo?
Eventuali duplicati:
Does Form.Dispose() call controls inside's Dispose()?Come si eliminano tutti i controlli in un pannello o modulo in UNA VOLTA ??? C#
c'è un modo per fare questo?
sia il pannello e la classe Form avere una proprietà Controls, che ha un metodo Clear() ...
MyPanel.Controls.Clear();
o
MyForm.Controls.Clear();
Ma Clear()
non chiama dispose()
(Tutto ciò che fa è rimuovere il controllo dalla raccolta), quindi quello che devi fare è
List<Control> ctrls = new List<Control>(MyPanel.Controls);
MyPanel.Controls.Clear();
foreach(Control c in ctrls)
c.Dispose();
È necessario creare un elenco separato dei riferimenti perché Dispose rimuoverà anche il controllo dalla raccolta, modificando l'indice e rovinando il foreach ...
non ha notato = P – Luiscencio
È anche possibile utilizzare un ciclo inverso per non danneggiare gli indici;) –
Non credo che ci sia un modo per farlo tutto in una volta. Si può solo scorrere i controlli figlio e chiamare ognuno di loro METODI DI SMALTIMENTO uno alla volta:
foreach(var control in this.Controls)
{
control.Dispose();
}
Questo metodo non funziona in Winforms, il ciclo 'foreach' si fermerà perché la collezione' this.Controls' è stata modificata. ** Il ciclo uscirà presto e non tutti i controlli saranno stati eliminati. ** ['Control.Dispose()' rimuove automaticamente il controllo dal suo genitore quando è eliminato] (https://referencesource.microsoft.com/#System) .Windows.Forms/WinForms/gestito/System/WinForms/Control.cs, 5919). – jrh
Non fornisce molti dettagli sul perché.
Ciò si verifica nel metodo di sovrascrittura del modulo (in form.designer.cs). Assomiglia a questo:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Non condividere se questo fosse ASP.Net o Winforms. In quest'ultimo caso, puoi fare abbastanza bene chiamando per la prima volta SuspendLayout()
sul pannello. Quindi, al termine, chiama ResumeLayout()
.
WebForms o WinForms? – jrummell