Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1469 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [Résolu] Comment faire ???

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Comment faire ???

n°1557606
pot2yaourt
Posté le 09-05-2007 à 20:06:58  profilanswer
 

: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
mood
Publicité
Posté le 09-05-2007 à 20:06:58  profilanswer
 

n°1557758
_darkalt3_
Proctopathe
Posté le 10-05-2007 à 09:10:39  profilanswer
 

Utilise le debugger et analyse le comportement de ton programme.


---------------
Töp of the plöp
n°1557772
MagicBuzz
Posté le 10-05-2007 à 09:33:30  profilanswer
 

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.

n°1557784
MagicBuzz
Posté le 10-05-2007 à 09:58:08  profilanswer
 

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
n°1558002
pot2yaourt
Posté le 10-05-2007 à 13:29:10  profilanswer
 

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
n°1558034
MagicBuzz
Posté le 10-05-2007 à 14:09:55  profilanswer
 

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" ;))

n°1558061
pot2yaourt
Posté le 10-05-2007 à 14:37:36  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [Résolu] Comment faire ???

 

Sujets relatifs
[résolu] [DOS] del sans confirmation[résolu] lien entre la 3D et c#
[HTACCESS/Résolu] Authentification conditionnée[résolu]Java:Appliquer une methode héritée sur un objet
[résolu] Graphique, localisation sur la page[résolu] Génération de graphique Excel, problème de location
[Resolu] Java Pathfinder [urgent]xmldom et plantage sous ie [Resolu]
[RESOLU]prob rmiWinBinder : Impossible d'accèder à mon objet [Résolu]
Plus de sujets relatifs à : [Résolu] Comment faire ???


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR