bonjour, comment puis je svp fermer toutes les win forms ouvertes sans connaitres leur nombre sachant que je connais uniquement le nom du winforms, ce dernier s'ouvre plusieurs fois, so je veux fermer toutes les instances a la fois
Version imprimable
bonjour, comment puis je svp fermer toutes les win forms ouvertes sans connaitres leur nombre sachant que je connais uniquement le nom du winforms, ce dernier s'ouvre plusieurs fois, so je veux fermer toutes les instances a la fois
Code:foreach (form frm in system.windows.application.openforms) { if (frm.name == "le nom que je cherche") frm.dispose(); }
Bonjour, merci pour la reponse, il me m'affiche une erreur :
Rappel :Citation:
La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.
Code:
1
2
3 foreach (Form frm in System.Windows.Forms.Application.OpenForms) if (frm.Name == "gridStatut") frm.Dispose();
ah oui je suis bête ^^
dispose sur le form le remove de openforms, et il est interdit de modifier une collection pendant le foreach
il faut dupliquer openforms dans une autre collection, avec un openforms.tolist par exemple
oh, c'est un peu difficile pour moi ca, peux tu stp m'expliquer d'avantage .?
ToList est dans le framework 3 ou 3.5Code:
1
2
3
4 foreach (Form frm in System.Windows.Forms.Application.OpenForms.ToList) if (frm.Name == "gridStatut") frm.Dispose();
Bonjour,
Pol63, j'ai l'impression que ça revient au même, il aura toujours la même erreur à l’exécution, dans le sens où la nouvelle liste sera modifiée aussi.
Dans ce cas là, il faut faire un bon vieux for...
Code:
1
2
3
4
5
6
7
8 for(int i = 0;i<System.Windows.Forms.Application.OpenForms.Count;i++) { if (System.Windows.Forms.Application.OpenForms[i].Name == "gridStatut") { System.Windows.Forms.Application.OpenForms[i].Close(); System.Windows.Forms.Application.OpenForms[i].Dispose(); } }
non
ToList créé une nouvelle collection, et copie les éléments de la collection de base dans la nouvelle (il n'y a pas de synchronistion, c'est un "snapshot")
le for each est donc sur une autre collection que openforms
fermer une fenetre fait qu'elle est retirée de openforms (mécanisme interne du framework)
si par contre le form était retiré d'une collection qui n'a rien à voir ca serait grave :D
je ne trouve pas pas le ToList dans openforms
Non ça n'existe pas ;)
Et que dois je faire j'ai beacoup de fenetre qui s'ouvre en meme temps
je t'ai posté un morceau de code plus haut qui fonctionne ;)
celui que tu m'a donné donne :
je vous explique mon probleme :Citation:
L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection
j'ai une interface, je peux cocher plusieurs case, chaque coche me donne une fenetre, si je coche 5 j'aurai 5 fenetre plus la fenetre mere ou ils y a les cases, quand je valide la premiere interface fillette, (il me reste 4 + la mere), celle la dois fermer et ouvrir une nouvelle fenetre mere et fermer l'ancienne pour que la fenetre mere puisse se mettre a jour
Oui c'est normale que ca te donne cette erreur, il faut itérer à l'inverse...
ça ne devrait plus te faire d'erreurCode:
1
2
3
4
5
6
7
8 for(int i = System.Windows.Forms.Application.OpenForms.Count-1;i>0;i--) { if (System.Windows.Forms.Application.OpenForms[i].Name == "gridStatut") { System.Windows.Forms.Application.OpenForms[i].Close(); System.Windows.Forms.Application.OpenForms[i].Dispose(); } }
C'est toujours la meme erreur
maintenant bon sauf qu'il me ferme toutes le fenetres meme cqui ne porte pas le nom gridstatutCitation:
L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : index
maintenant il faut apprendre à débugger ;)
parfois il me donne l'erreur que j'ai decrite en haut
EditCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 if (isn != 0 && isnd != 0) { for (int i = System.Windows.Forms.Application.OpenForms.Count - 1; i > 0; i--) { if (System.Windows.Forms.Application.OpenForms[i].Name == "gridStatut") { System.Windows.Forms.Application.OpenForms[i].Close(); System.Windows.Forms.Application.OpenForms[i].Dispose(); } } gridStatut gs = new gridStatut(m_agrSelected, m_anSelected); gs.Show(); this.Hide(); }
J'ai enlevé la ligne de dispose il me donne plus d'erreur