2009-10-02 14 views

risposta

25

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 ...

+0

non ha notato = P – Luiscencio

+6

È anche possibile utilizzare un ciclo inverso per non danneggiare gli indici;) –

1

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(); 
} 
+1

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

1

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); 
} 
0

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().

Problemi correlati