[Résolu] Comment faire ???

Comment faire ??? [Résolu] - C#/.NET managed - Programmation

Marsh Posté le 09-05-2007 à 20:06:58    

:hello: à tous,  
 
Voilà, j'ai un petit problème de communication/fonctionnement entre 2 forms et je ne sais pas comment le résoudre... peut-être aussi que je m'y prends mal ?  
 
Je vais essayer de faire simple :
 
J'ai donc deux forms, form1 et form2. Dans form1, lorsque je clique sur un bouton j'ouvre form2 avec ShowDialog() et je récupère ensuite le résultat du DialogResult (voir plus loin).
 
De là, je remplis qqs textBox dans form2, puis je valide le tout en cliquant sur un bouton Ok. La validation des textBox se fait dans un try/catch.
 
Ensuite, de retour dans form1, je regarde si le DialogResult = Ok et, si oui, alors je fais d'autres traitements (je récupère des données dans form2 via un accesseur).
 
Mon pblm se situe au niveau du try/catch dans la form2 : si une erreur est levée pdt la validation des textBox, l'erreur est affichée mais dès que je clique sur le bouton Ok de la boîte de dialogue, form2 se ferme automatiquement et les traitements situés après le "if(result == DialogResult.OK)" dans le form1 s'effectuent... alors qu'ils ne devraient s'effectuer UNIQUEMENT s'il n'y a pas eu d'erreur. En fait, je pensais que s'il y avait une erreur, cela aurait bloqué la fermeture de form2.  :heink:  
 
J'ai essayé d'initialiser la propriété DialogResult du bouton Ok (situé sur la form2), uniquement dans le try/catch et pas avant. Ainsi j'espèrais renvoyer le "DialogResult.OK" que si le traitement ne provoquait pas d'erreur. Manque de bol, si une erreur survient pdt la validation des textBox une erreur est affichée (jusque là tout va bien !) mais ensuite rien ne se passe. Il faut que je clique une seconde fois sur le bouton Ok pour valider les textBox, form2 se ferme alors et form1 poursuit les traitements.  :cry:  
 
Bref, j'attends vos avis...  :love:  
Lionel.


Message édité par pot2yaourt le 10-05-2007 à 14:38:27
Reply

Marsh Posté le 09-05-2007 à 20:06:58   

Reply

Marsh Posté le 10-05-2007 à 09:10:39    

Utilise le debugger et analyse le comportement de ton programme.


---------------
Töp of the plöp
Reply

Marsh Posté le 10-05-2007 à 09:33:30    

Dans l'évènement handler "OnClose" (ou un truc du genre), c'est là que tu vas faire tes traîtements.
 
L'event argument dispose d'une propriété "cancel" que tu dois passer à True si tu veux annuler la clôture de la fenêtre.

Reply

Marsh Posté le 10-05-2007 à 09:58:08    

Code :
  1. private void Form2_FormClosing(object sender, FormClosingEventArgs e)
  2.        {
  3.            // Aucune action préféfinie, donc à priori, c'est un bouton
  4.            if (e.CloseReason == CloseReason.None)
  5.            {
  6.                if (this.DialogResult == DialogResult.OK)
  7.                {
  8.                    // Validation des données saisies
  9.                    if (textBox1.Text.Length == 0)
  10.                    {
  11.                        // Petit message très poli pour expliquer au mongolien qui est derrière le clavier qu'il faut remplir le champ
  12.                        MessageBox.Show("Vas-y gros naze, rempli-moi cette putain de textbox sale bâtard" );
  13.                        e.Cancel = true;
  14.                        textBox1.Focus();
  15.                    }
  16.                }
  17.            }
  18.        }


 
Evidement, dans le designer, on a ça :

Code :
  1. this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
  2.            this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
  3.            // Je ne suis pas convaincu de l'utilité de ces deux lignes mais bon...
  4.            this.AcceptButton = this.button1;
  5.            this.CancelButton = this.button2;


 
PS : Et on n'exécute jamais le moindre code sur les boutons d'action ! Effectivement, on peut parfaitement valider un formulaire autrement qu'en cliquant sur un bouton, et du coup le code risque de ne pas être exécuté, tout comme on peut vouloir gérer un ATL+F4 comme un "Ok". Donc toujours bien dire à .NET que les bouton ont une action "système", ce qui déclenche systématiquement le Closing, tout comme un shutdown de windows, ou une destruction tu process père...
=> On peut très bien décider qu'un arrêt de windows signifie un "DialogResult.Ok" (c'est débile mais bon :D)


Message édité par MagicBuzz le 10-05-2007 à 10:05:40
Reply

Marsh Posté le 10-05-2007 à 13:29:10    

Encore une fois, merci Super MagicBuzz !  :jap:  
 
Effectivement, c'est pas bête de déporter le contrôle du textBox sur l'événement Closing plutôt que le Click du bouton. Je t'âcherai d'y penser pour les prochaines fois.
 
Par contre, ce qui me pose problème au niveau de la compréhension, c'est : if (this.DialogResult == DialogResult.OK). Dans ce cas, this.DialogResult représente la propriété de la Form2 et non pas la propriété de button1, je me gourre ? Si j'ai juste, je ne comprends pas pourquoi tu teste cette propriété ?  :??:  
 
D'un autre côté, j'ai testé en mettant if(this.button1.DialogResult == DialogResult.OK) à la place de if (this.DialogResult == DialogResult.OK) et là, que je clique sur la croix pour fermer la form ou sur bouton ok, le résultat est le même : le contrôle du textBox s'effectue à chaque fois. Je ne remets donc pas en cause ton code (loin de là étant donné qu'il fonctionne très bien !) mais j'aimerai juste savoir pourquoi ça marche ainsi.
 
Encore merci pour tout !
Lionel.

Message cité 1 fois
Message édité par pot2yaourt le 10-05-2007 à 13:49:25
Reply

Marsh Posté le 10-05-2007 à 14:09:55    

pot2yaourt a écrit :

Par contre, ce qui me pose problème au niveau de la compréhension, c'est : if (this.DialogResult == DialogResult.OK). Dans ce cas, this.DialogResult représente la propriété de la Form2 et non pas la propriété de button1, je me gourre ? Si j'ai juste, je ne comprends pas pourquoi tu teste cette propriété ?  :??:


 
Le fait que tu mettes dans ton Designer "button1.DialogResult = DialogResult.Ok;" signifie que lorsque tu cliques sur le bouton, alors il va initialiser la propriété form2.DialogResult à cette valeur, puis demander la fermeture de la fenêtre.
Etant donné que dans mon exemple, j'ai aussu un button2, qui fait la même chose, mais en collant un DialogResult.Cancel, je dois évidement tester cette valeur avant toute autre chose : si le gars annule la saisie (genre "ah mais oui mais en fait, je veux pas enregistrer mon fichier" ) on va pas lui dire qu'on attend un nom de fichier et le bloquer sur la fenêtre. on ne doit donc bloquer la fenêtre que s'il a validé.
Ensuite, de base, form2.DialogResult = DialogResult.None. Donc si je fais "ALT + F4" je n'ai pas validé le formulaire, donc je fais comme si j'avais annulé.
 
Par contre, dans ton test, "if (button1.DialogResult == DialogResult.Ok)" il va systématiquement être vrai, que tu aies appuyé sur le bouton ou pas (c'est comme si tu testais le libellé du bouton pour vérifier s'il est égal à "Ok" ;))

Reply

Marsh Posté le 10-05-2007 à 14:37:36    

MagicBuzz a écrit :

Le fait que tu mettes dans ton Designer "button1.DialogResult = DialogResult.Ok;" signifie que lorsque tu cliques sur le bouton, alors il va initialiser la propriété form2.DialogResult à cette valeur, puis demander la fermeture de la fenêtre.


 
Ah ok !! Je ne savais que le bouton allait initialiser la propriété DialogResult de la form... forcément, maintenant tout s'explique !
 
 

MagicBuzz a écrit :


Par contre, dans ton test, "if (button1.DialogResult == DialogResult.Ok)" il va systématiquement être vrai, que tu aies appuyé sur le bouton ou pas (c'est comme si tu testais le libellé du bouton pour vérifier s'il est égal à "Ok" ;))


 
Ah ben oui ! Quel c.. ! :sweat:  
 
Une fois de plus je réitère mes remerciements !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed