2009-10-02 7 views

Répondre

25

Le Groupe spécial et la classe Form ont une propriété de collection de contrôles, qui a une méthode claire() ...

MyPanel.Controls.Clear(); 

ou

MyForm.Controls.Clear(); 

Mais Clear() ne remet pas dispose() (Tout ce qu'il fait est de retirer le contrôle de la collection), donc ce que vous devez faire est

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

Vous devez créer une liste séparée des références car Dispose enlèvera aussi le contrôle de la collection, changera l'index et détruira le ...

+0

n'a pas remarqué = P – Luiscencio

+6

Vous pouvez également utiliser un inverse pour la boucle, il ne gâchera pas les index;) –

1

Je ne crois pas qu'il existe un moyen de faire tout cela en même temps. Vous pouvez simplement itérer les contrôles enfants et appeler chacun de leurs méthodes prédisposent à la fois:

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

Cette méthode ne fonctionne pas dans Winforms, la boucle 'foreach' s'arrêtera car la collection' this.Controls' a été modifiée. ** La boucle quittera tôt et tous les contrôles n'auront pas été éliminés. ** ['Control.Dispose()' supprime automatiquement le contrôle de son parent lorsqu'il est éliminé] (https://referencesource.microsoft.com/#System .Windows.Forms/winforms/Managed/Système/WinForms/Control.cs, 5919). – jrh

1

Vous ne donnez pas beaucoup de détails pour expliquer pourquoi.

Cela se produit dans la méthode Dispose override du formulaire (dans form.designer.cs). Il ressemble à ceci:

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

    base.Dispose(disposing); 
} 
0

Vous ne partagez pas si cela ASP.Net ou Winforms. Si ce dernier, vous pouvez faire assez bien en appelant d'abord SuspendLayout() sur le panneau. Ensuite, lorsque vous avez terminé, appelez ResumeLayout().