2009-09-29 8 views
1

J'ai un contrôle Panel. Et à l'intérieur du panneau, les utilisateurs peuvent ajouter des combobox, des étiquettes de textbox, etc. et les faire glisser, et il y a un bouton Supprimer sur mon formulaire où s'ils cliquent dessus, tous les contrôles seront supprimés. MAIS ce code:C# Non Éliminer les commandes comme je l'ai indiqué à

foreach(Control control in panel.Controls) 
{ 
    control.Dispose(); 
} 

... Ne fonctionne pas correctement. Il n'élimine pas toujours TOUS les contrôles à l'intérieur du panneau. Parfois, il se débarrasse de la plupart d'entre eux, parfois il se débarrasse seulement d'un ou deux. Parfois, tous sauf un sont jetés. WTF?

EDIT:


Voici le code que j'utilise pour ajouter les contrôles au Groupe:

button1_Click(object sender, EventArgs e) 
{ 
    TextBox tbox = new TextBox(); 
    tbox.Multiline = true; 
    tbox.IsAccessible = true; 

    panel.Controls.Add(tbox); 
} 
+2

Je pense que votre problème est ailleurs dans le code. – David

+0

Je vais modifier ma question avec le code utilisé pour créer les contrôles. –

+3

Je suis d'accord avec la réponse de Dan Herbert. Je pense que vous avez une incompréhension fondamentale de ce que fait l'appel. –

Répondre

8

Une façon plus simple de supprimer tous vos contrôles est de le faire:

panel.Controls.Clear(); 

Edit: grâce à Pieter et Paolo, en appelant simplement Clear() comme ceci va fuir la mémoire puisque les contrôles ne sont pas éliminés, donc ce n'est pas une bonne pratique.

+0

merci MusiGenesis :) –

+1

Notez que cela ne mettra pas vos commandes au rebut. Il les supprime uniquement de la collection. –

+0

@Pieter: notez également que tous les contrôles n'ont pas besoin d'être invoqués par Dispose(), ce que je suppose être ce que vous dites. Sinon, les supprimer de la collection de contrôles * les * exposera à la récupération de place, en supposant qu'ils ne sont pas référencés ailleurs. Il semble que OP a seulement utilisé Dispose() à l'origine sur la base d'une mauvaise compréhension de la façon de "supprimer" les contrôles. – MusiGenesis

8

Dispose() nettoie uniquement les ressources non gérés (bien que Paul Williams a noté dans les commentaires qu'il est généralement plus complexe que cela!) donc il peut ou peut ne pas faire quelque chose d'utile dans votre cas.

Essayez de supprimer les contrôles avec la méthode RemoveAt(i), non Dispose():

for(int i = panel.Controls.Count-1; i >= 0; i--) 
{ 
    panel.Controls.RemoveAt(i); 
} 
+6

Ou vous pouvez utiliser panel.Controls.Clear() si vous voulez les supprimer tous. Control.ControlCollection prendra soin de nettoyer si nécessaire. – Patrik

+0

merci Dan Herbert –

+0

Une méthode Dispose (boolean) surchargée appropriée dispose de ressources gérées et non gérées. Disposer (vrai) signifie disposer des deux. Dispose (false) signifie que vous avez un finaliseur et que le finaliseur a appelé la méthode Dispose. Si elle est appelée à partir d'un finaliseur, la méthode Dispose ne doit pas toucher d'autres objets gérés. C'est trop tard pour ça. –

3

J'ai vu cela auparavant, vous supprimez des objets d'acollection qui rendent la collection elle-même plus petite. Par exemple, s'il y a 5 éléments dans la collection lorsque vous la parcourez, vous arrivez à la fin de la liste plus tôt que prévu car la liste est plus petite avec chaque Dispose() que vous émettez.

+1

Vous ne savez pas si cela va s'appliquer dans une boucle foreach. – Lazarus

+0

merci Darrin qui a été très apprécié. Je comprends ce qui se passe maintenant. Merci encore. :) –

0

Je sais que c'est un vieux post, mais j'espère pouvoir aider quelqu'un.

La seule façon que j'ai trouvé qui fonctionne est:

while(panel.Controls.Count > 0) 
{ 
    panel.Controls[0].Dispose(); 
} 

De cette façon, peu importe si la liste des contrôles deviennent plus petits au milieu de la boucle.