2009-10-02 5 views

Antwort

25

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

+0

hat nicht bemerkt = P – Luiscencio

+6

Sie können auch eine umgekehrte Schleife verwenden, es wird die Indizes nicht durcheinander bringen;) –

1

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

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

1

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

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