none
C# - Pb. ShowDialog RRS feed

  • 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.

    lundi 19 février 2018 20:38

Toutes les réponses

  • Pour information, cela se produisait.

    Je viens tout juste d'avoir un nouvel ordinateur.

    Au delà de mes données personnelles, j'ai juste réinstallé Visual Studio et SQL Server et j'ai le même problème.

    mardi 20 février 2018 19:07
  • Re,

    Quel est ton code de Button2 et Button3 ?

    mercredi 21 février 2018 08:32
  • 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.

    jeudi 22 février 2018 11:07
  • 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.

    jeudi 22 février 2018 11:23
  • 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.

    jeudi 22 février 2018 14:45
  • Où puis-je trouver un site de partage qui vous convienne ?
    jeudi 22 février 2018 15:37
  • Pour info TEST.zip a été placé sur OneDrive à l'adresse

    https://1drv.ms/f/s!AibbDfzruLGsi3fqTezg-Dfhb0jG

    jeudi 22 février 2018 16:51
  • 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.

    mardi 27 février 2018 16:25
  • 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.

    vendredi 2 mars 2018 19:28
  • 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.

    mardi 6 mars 2018 14:29
  • 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,

    mardi 6 mars 2018 15:13
  • 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.

    mercredi 7 mars 2018 08:34
  • 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.

    mercredi 7 mars 2018 16:59
  • 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.


    mercredi 7 mars 2018 22:05
  • 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.

    jeudi 8 mars 2018 14:31
  • 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

    jeudi 8 mars 2018 16:02
  • 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.

    jeudi 8 mars 2018 16:15
  • 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. 

    jeudi 8 mars 2018 16:37
  • 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.

    jeudi 8 mars 2018 16:51
  • 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.


    jeudi 8 mars 2018 17:03
  • Pourquoi un MessageBox ferme la fenêtre ?

    Voir exemple fourni.

    Pourquoi cette nouveauté ?

    Dans l'attente de votre retour.

    jeudi 8 mars 2018 17:08
  • Ce n'est pas le MessageBox qui ferme la fenêtre, c'est le fait que votre bouton ait la propriété DialogResult à cancel qui le ferme. 
    jeudi 8 mars 2018 17:44
  • 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.

    jeudi 8 mars 2018 18:16
  • Etant donné que tout ceci n'existait pas, avez-vous une procédure qui permettent de mettre à jour automatiquement tous les projets C# ? 
    jeudi 8 mars 2018 18:18