Auteur de questions
C# - Pb. ShowDialog

Question
-
Bonjour,
J'ai un gros projet avec près de 200 fenêtres modales.
Pour ouvrir une modale (Form2 par exemple), utilise toujours la même méthode :
Form2 fen=new Form2();
fen. ShowDialog();
Voici le contexte type :
Form1 possède un Button1.
Button1 ouvre Form2 en modale.
Form2 possède un Button2.
Form2 à la propriété CancelButton positionné sur Buttton2.
Button2 ouvre Form3 en modale.
Form3 possède un Button3.
Form3 à la propriété CancelButton positionné sur Buttton3.
Enchaînement des opérations :
J'ouvre Form1.
J'ouvre Form2 avec Button1.
J'ouvre Form3 avec Button2.
Problème :
Lorsque je ferme Form3 avec la touche Echap, Alt F4 ou la croix, Form3 se ferme (normal) mais aussi Form2.
On revient à Form1.
Ceci est valable pour tous mes projets.
Avez-vous une explication.
Merci par avance de votre aide.
Toutes les réponses
-
-
-
Sur le Butoon2 je fais :
Form3 fen =new Form3();
fen.ShowDialog();
Sur la Form3 je n'ai pas de code. Sur les propriétés de la Form3 j'ai juste CancelButton=Button3.
J'ai le même problème sur tout mes projets professionnels qui peuvent avoir 200 fenêtres.
Ceci me bloque car je ne peux plus livrer mes projets. Je viens de perdre un contrat de 50000€ et ce n'est pas fini.
-
Si cela peut aider j'ai un partage du petit exemple:
\\LAPTOP-T36FUC9G\WindowsFormsApp4
Je peux vous créer un partage sur un module de gros projet professionnel avec la base de données SQL Server qui va avec.
Le premier partage avec été créé pour votre équipe gestion de projets qui m'a envoyé bouler en m'indiquant au bout de deux semaines que je faisais de la plaisanterie.
-
J'ai dit que c'était de la plaisanterie tout simplement car tu ne dois pas connaitre les bases réseau... et c'est le B.a - Ba de l'informatique.
Un simple partage par nom de machine ne peut pas fonctionner.... Le nom de machine ne passe pas ton routeur et ne peut fonctionner qu'en local sur ton réseau.
Zip ton projet et partage le par un site de partage.
-
-
Pour info TEST.zip a été placé sur OneDrive à l'adresse
-
Bonjour,
Je me permet de vous relancer.
En effet depuis 1 mois je suis bloqué.
Ma société ne peut plus assurer ses contrats de maintenance corrective et évolutive.
J'ai beau chercher dans tous les sens, je ne comprend pas ce qui arrive.
Le phénomène se produit sur tous nos projets Visual Studio C#. Nous ne pouvons plus maintenir et développer aucune application. De ce fait nous ne pouvons plus honorer nos contrats avec nos clients.
Encore une fois, nous avons besoin de votre aide pour nous sortir de ce problème.
Merci par avance de votre retour.
-
Bonjour,
Avez-vous pu trouver une explication ?
Merci beaucoup de votre retour car cela fait environ un mois que nous sommes sans retour de votre part et notre entreprise se trouve dans une situation de plus en plus précaire.
Pouvez-vous nous indiquer où vous en êtes afin de "calmer" nos clients.
-
Bonjour,
Vous m'avez demandé un petit exemple du problème, chose que je vous ai fourni.
Avez-vous pu avancer sur le sujet car depuis le 26 janvier je n'ai pas de nouvelle de vous.Encore une foi je vous demande de me faire un signe et de m'aider.
Une nouvelle foi, merci beaucoup par avance.
-
Bonjour Laurent,
Ce problème arrive lorsqu'un appel à ShowDialog est effectué, l'état du parent dépend aussi de la fenêtre enfant. Il existe un moyen simple d'empêcher cela :
Lorsque vous appelez votre fenêtre modale, vous devez spécifier la propriété DialogResult à None une fois l'appel à ShowDialog effectué, cela aura pour empêcher la modification de l'état de la fenêtre appelante :
Form3 fen = new Form3(); DialogResult result = fen.ShowDialog(this); this.DialogResult = DialogResult.None;
Voici un post qui parle de ce problème : ShowDialog() from within a ShowDialog() – both closing
Cordialement,
-
OK cela fonctionne.
Ce que je ne comprend pas c'est pourquoi la méthode que j'utilisait a toujours fonctionnée.
N'y a t-il pas eu une mise à jour pourrie ?
Je doit revoir 14 ans (ancienneté de ma société) de développement
Cette méthode n'est pas décrite sur les sites Microsoft.
J'ai perdu de gros contrats et ma société est en dépôt de bilan.
Je viens de mettre deux développeurs au chômage.
Merci de votre réactivité.
Cordialement.
-
En fait cela ne fonctionne pas dans tous les cas.
Exemple :
Form1 ouvre une Form2 suivant méthode indiquée.
Sur Form2 il y a un boutton qui affiche un simple MessageBox.Show.
Lorsque l'on clique OK sur le MessageBox, Form2 se ferme et l'on revient à Form1
Ceci est bloquant car j'ai des centaines de fenêtres sur lesquelles on est amené à afficher des MessageBox.
N'y a t-il pas un patch qui corrige tout ces problèmes apparus il y a plus d'un mois et ce malgrès des réinstallations de Visual Studio et même l'achat d'une nouvelle machine..
Merci de votre retour.
-
Je suis au regrès de vous dire que vous devez faire une erreur de votre côté : j'ai reproduit votre cas
- 1 form principal avec 1 bouton
- lorsqu'un clique sur le bouton, cela ouvre Form2 de façon modale comme ceci :
private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); DialogResult result = form2.ShowDialog(this); this.DialogResult = DialogResult.None; }
- Sur ma Form2, j'ai un bouton qui ouvre une MessageBox :
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("TEST"); }
à l'exécution, lorsque je clique sur le bouton de la form1, la form2 apparaît et lorsque je clique sur le bouton de la form2, une messagebox apparaît et lorsque je clique sur OK, la Form2 reste apparente (ne se ferme pas). Vous devez avoir un problème de conception.
- Modifié Arthur LeMeur mercredi 7 mars 2018 22:18
-
Il n'y a pas de problème de conception;
Nous avons des applications qui remontent à 14 ans et qui n'avaient pas de problème.
Des centaines de MessageBox et ShowDialog.
Le problème de fond vient sans doute d'une mise à jour de Microsoft.
Selon moi, tous les problèmes apparaissent depuis et dès lors que l'on indique un Buton sur la propriété CancelButon d'une Form.
Sur le lien suivant je vous ai mis un exemple tout simple (TEST.zip).
https://1drv.ms/u/s!AibbDfzruLGsjT4TouxgeXhjNn5V
Si besoin je peux vous fournir une application "moyenne" ou il y a des dizaines de ShowDialog et MessageBox.
Merci de votre retour.
-
Faudra m'expliquer pourquoi vous avez mis le comportement du bouton qui ouvre la MessageBox à DialogResult.Cancel, il est donc tout à fait normal que la Form2 se ferme dès que l'évément de clic du bouton se termine.
Remettez la propriété DialogResult du bouton button1 de votre Form2 à None.
-
Comme déjà évoqué, toutes les applications que notre société développait depuis 14 ans ont la propriété CancelButon avtivée.
Ceci fait partie de la charte ergonomique que nous signons avec nos clients et pour laquelle nous nous engagons depuis toujours.
En effet nous voulons utiliser la touche Echap pour fermer une fenêtre. Equivalent clavier d'un bouton de type Retour ou Abandon.
Comme vous avez pu le constater, si vous mettez la propriété CancelButton à None, le problème persiste. Il est impossible de faire machine arrière.
Je rappelle que le problème s'est déclaré il y a un peu plus d'un mois.
Ceci concerne tous nos postes de développements ainsi que nos serveurs (SQL, CIRIX, partages etc.).
Comme déjà indiqué nous avons même acheté une nouvelle machine (1700€) il y a deux semaines.
Vous me parer de CancelButon mais cette propriété a toujours fonctionnée et ce sur des Go de code. Depuis un mois elle ne fonctionne plus et provoque de forts disfonctionnements comme les deux exemples cités.
Dans l'attente de votre retour.
-
Je vous conseille de lire la documentation, ceci est le comportement normal d'un bouton : Button.DialogResult Property.
Je cite :
"If the DialogResult for this property is set to anything other than None, and if the parent form was displayed through the ShowDialog method, clicking the button closes the parent form without your having to hook up any events. The form's DialogResult property is then set to the DialogResult of the button when the button is clicked."
et ce, depuis la version 1.1 du Framework .NET.
-
Je ne comprend pas. Je peux vous fournir des sources de plus de 10 ans où cela fonctionnait très bien.
A quoi sert la propriété CancelButton alors ?
Même en Frameword 1.1 la propriété CancelButton avait une réaction normale. En effet nous avons toujours eu des applications développées en 1.1 même si par la suite nous les avons progressivement migrées.
Si vous désirez des sources, pas de problème. Vous pourrez constater par vous-même.
Par expérience, je reste persuadé qu'il y a une régression.
Je suppose que vous n'avez pas manqué par vous-même de faire l'essai sur le petit exemple fourni, à savoir passer la propriété CancelButton à None.
Dans l'attente de votre retour.
-
La propriété CancelButton définie simplement le comportement sur un bouton lorsque l'utilisateur appuie sur la touche Echap de son clavier. Cela à pour effet de définir le comportement du bouton à Cancel dans la fenêtre modale.
- Modifié Arthur LeMeur jeudi 8 mars 2018 17:03
-
-
-
Si je comprend bien :
1/ Il faut changer la méthode ShowDialog
2/ Il faut changer la propriété DialogResult des boutons
Cela implique que je doivent adapter 14 ans de développements et des Go de code.
D'où vient cette nouveauté ?
Je vous rappelle que cela fait depuis le 26/01/2018 que j'attend une réponse.
Même si vous n'y répondez pas complétement, tout ceci me coûte très cher : société + 3 personnes au chômage.
-