Mögliche Duplizieren:
Does Form.Dispose() call controls inside's Dispose()?Wie stelle ich alle Steuerelemente in einem Panel oder Formular bei ONCE? C#
ist es eine Möglichkeit, dies zu tun?
Mögliche Duplizieren:
Does Form.Dispose() call controls inside's Dispose()?Wie stelle ich alle Steuerelemente in einem Panel oder Formular bei ONCE? C#
ist es eine Möglichkeit, dies zu tun?
Sowohl das Panel und die Form-Klasse haben eine Controls-Auflistung Eigenschaft, die ein Clear() Methode hat ...
MyPanel.Controls.Clear();
oder
MyForm.Controls.Clear();
Aber Clear()
stellt nicht dispose()
(Alles, was es tut, ist, das Steuerelement aus der Sammlung zu entfernen. Was Sie also tun müssen, ist
Sie müssen eine separate Liste der Referenzen erstellen, da Dispose auch das Steuerelement aus der Sammlung entfernt, den Index ändert und die foreach ...
hat nicht bemerkt = P – Luiscencio
Sie können auch eine umgekehrte Schleife verwenden, es wird die Indizes nicht durcheinander bringen;) –
Ich glaube nicht, dass es einen Weg gibt, dies auf einmal zu tun. Sie können nur durch die untergeordneten Steuerelemente durchlaufen und jedes ihrer dispose Methoden einer nach dem anderen nennen:
foreach(var control in this.Controls)
{
control.Dispose();
}
Diese Methode funktioniert nicht in Winforms, die 'foreach'-Schleife wird angehalten, weil die' this.Controls'-Sammlung geändert wurde. ** Die Schleife wird vorzeitig beendet, und nicht alle Controls wurden entfernt. ** [Control.Dispose() 'entfernt das Control automatisch von seinem übergeordneten Element, wenn es entsorgt wird] (https://referencesource.microsoft.com/#System .Windows.Forms/winforms/Managed/System/WinForms/Control.cs, 5919). – jrh
Sie nicht viel Detail, warum geben Sie.
Dies geschieht in der Dispose überschreiben Methode des Formulars (in form.designer.cs). Es sieht so aus:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Sie haben nicht geteilt, wenn dies ASP.Net oder Winforms waren. Wenn Letzteres, Sie können gut genug tun, indem Sie zuerst SuspendLayout()
auf dem Panel aufrufen. Wenn Sie fertig sind, rufen Sie ResumeLayout()
.
WebForms oder WinForms? – jrummell