2009-10-02 13 views

Odpowiedz

25

Zarówno panel i klasa Form mają właściwość kolekcji Controls, który ma metodę clear() ...

MyPanel.Controls.Clear(); 

lub

MyForm.Controls.Clear(); 

Ale Clear() nie wymaga dispose() (Wystarczy, że usunie kontrolę z kolekcji), więc musisz to zrobić:

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

Należy utworzyć osobną listę odniesień, ponieważ Dispose także usunie formant z kolekcji, zmieni indeks i zepsuje foreach ...

+0

nie zauważyłem = P – Luiscencio

+6

Możesz również użyć pętli odwrotnej, nie zepsuje indeksów;) –

1

Nie wierzę, że istnieje sposób, aby zrobić to wszystko naraz. Można po prostu iterację formantów podrzędnych i dzwonić do siebie ich wrzucać metod jednym na raz:

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

Ta metoda nie działa w WinFormach, pętla 'foreach' zostanie zatrzymana, ponieważ kolekcja' this.Controls' została zmodyfikowana. ** Pętla zostanie wcześniej zakończona i nie wszystkie elementy sterowania zostaną usunięte. ** ['Control.Dispose()' automatycznie usuwa kontrolę z nadrzędnej, gdy jest usuwany] (https://referencesource.microsoft.com/#System .Windows.Forms/winforms/Managed/System/WinForms/Control.cs, 5919). – jrh

1

Nie dać wiele szczegółów, dlaczego.

Dzieje się tak w przypadku metody zastępowania formularza (w form.designer.cs). Wygląda to tak:

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

    base.Dispose(disposing); 
} 
0

Nie udostępniałeś, jeśli to był ASP.Net lub WinForm. Jeśli to drugie, możesz zrobić wystarczająco dobrze, najpierw dzwoniąc pod numer SuspendLayout(). Następnie, po zakończeniu, zadzwoń pod numer ResumeLayout().

Powiązane problemy