Powiel możliwe:
Does Form.Dispose() call controls inside's Dispose()?Jak pozbyć się wszystkich elementów sterujących w panelu lub formie na RAZ? C#
czy jest jakiś sposób aby to zrobić?
Powiel możliwe:
Does Form.Dispose() call controls inside's Dispose()?Jak pozbyć się wszystkich elementów sterujących w panelu lub formie na RAZ? C#
czy jest jakiś sposób aby to zrobić?
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 ...
nie zauważyłem = P – Luiscencio
Możesz również użyć pętli odwrotnej, nie zepsuje indeksów;) –
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();
}
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
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);
}
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()
.
WebForms lub WinForms? – jrummell