Possible en double:
Does Form.Dispose() call controls inside's Dispose()?Comment puis-je disposer de toutes les commandes dans un panneau ou un formulaire à ONCE ??? C#
est-il un moyen de le faire?
Possible en double:
Does Form.Dispose() call controls inside's Dispose()?Comment puis-je disposer de toutes les commandes dans un panneau ou un formulaire à ONCE ??? C#
est-il un moyen de le faire?
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 ...
n'a pas remarqué = P – Luiscencio
Vous pouvez également utiliser un inverse pour la boucle, il ne gâchera pas les index;) –
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();
}
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
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);
}
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()
.
WebForms ou WinForms? – jrummell