IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

ErrorProvider et fermeture de formulaire


Sujet :

Windows Forms

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut ErrorProvider et fermeture de formulaire
    Bonjour à tous et bon début de semaine,

    Je veux utiliser un ErrorProvider dans mon formulaire. Pour faire un petit test, j'écris le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            private void textBox1_Validating(object sender, CancelEventArgs e)
            {
                if (Regex.IsMatch(textBox1.Text, @"^\d+$"))
                {
                    e.Cancel = false;
                    errorProvider1.SetError(textBox1, "");
                }
                else
                {
                    e.Cancel = true;
                    errorProvider1.SetError(textBox1, "Vous ne pouvez saisir que des chiffres");
                }
            }
    Ça fonctionne très bien mais crée un comportement un peu ennuyeux. Impossible de fermer mon formulaire sans saisir une valeur correspondante à ce qui est demandé.

    Est-ce qu'il y a une solution pour permettre la fermeture de ma Form même si les valeurs correctes n'ont pas été saisies ?

    Papy !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    J'ai le même problème, si quelqu'un a une idée ...
    Papy tu as peut être résolu le souci ?

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Bonjour,

    C'est le e.cancel = true qui oblige à rester dans le controle de saisie.
    Voilà un petit exemple d'utilisation simplifiée qui affiche les indications d'erreurs mais qui n'empèche pas de sortir des zones de saisie ni de quitter la feuille.

    Le designer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    namespace WindowsFormsApplication1
    {
        partial class Form1
        {
            /// <summary>
            /// Variable nécessaire au concepteur.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            /// Nettoyage des ressources utilisées.
            /// </summary>
            /// <param name="disposing">true si les ressources managées doivent être supprimées*; sinon, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            #region Code généré par le Concepteur Windows Form
     
            /// <summary>
            /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
            /// le contenu de cette méthode avec l'éditeur de code.
            /// </summary>
            private void InitializeComponent()
            {
                this.components = new System.ComponentModel.Container();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.textBox2 = new System.Windows.Forms.TextBox();
                this.textBox3 = new System.Windows.Forms.TextBox();
                this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);
                this.label1 = new System.Windows.Forms.Label();
                this.label2 = new System.Windows.Forms.Label();
                this.label3 = new System.Windows.Forms.Label();
                this.button1 = new System.Windows.Forms.Button();
                ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).BeginInit();
                this.SuspendLayout();
                // 
                // textBox1
                // 
                this.textBox1.Location = new System.Drawing.Point(12, 36);
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(246, 20);
                this.textBox1.TabIndex = 0;
                this.textBox1.Tag = "^\\d+$";
                this.textBox1.Text = "1";
                this.textBox1.Validating += new System.ComponentModel.CancelEventHandler(this.InputValidating);
                // 
                // textBox2
                // 
                this.textBox2.Location = new System.Drawing.Point(12, 89);
                this.textBox2.Name = "textBox2";
                this.textBox2.Size = new System.Drawing.Size(246, 20);
                this.textBox2.TabIndex = 1;
                this.textBox2.Tag = "^\\W+$";
                this.textBox2.Validating += new System.ComponentModel.CancelEventHandler(this.InputValidating);
                // 
                // textBox3
                // 
                this.textBox3.Location = new System.Drawing.Point(12, 142);
                this.textBox3.Name = "textBox3";
                this.textBox3.Size = new System.Drawing.Size(246, 20);
                this.textBox3.TabIndex = 2;
                this.textBox3.Tag = "^[a-z]+$";
                this.textBox3.Validating += new System.ComponentModel.CancelEventHandler(this.InputValidating);
                // 
                // errorProvider1
                // 
                this.errorProvider1.ContainerControl = this;
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(13, 20);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(42, 13);
                this.label1.TabIndex = 3;
                this.label1.Text = "Chiffres";
                // 
                // label2
                // 
                this.label2.AutoSize = true;
                this.label2.Location = new System.Drawing.Point(13, 73);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(99, 13);
                this.label2.TabIndex = 3;
                this.label2.Text = "Ni chiffres, ni lettres";
                // 
                // label3
                // 
                this.label3.AutoSize = true;
                this.label3.Location = new System.Drawing.Point(12, 126);
                this.label3.Name = "label3";
                this.label3.Size = new System.Drawing.Size(39, 13);
                this.label3.TabIndex = 3;
                this.label3.Text = "Lettres";
                // 
                // button1
                // 
                this.button1.Enabled = false;
                this.button1.Location = new System.Drawing.Point(183, 231);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 4;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 266);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.label3);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.textBox3);
                this.Controls.Add(this.textBox2);
                this.Controls.Add(this.textBox1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.Shown += new System.EventHandler(this.Form1_Shown);
                ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).EndInit();
                this.ResumeLayout(false);
                this.PerformLayout();
     
            }
     
            #endregion
     
            private System.Windows.Forms.TextBox textBox1;
            private System.Windows.Forms.TextBox textBox2;
            private System.Windows.Forms.TextBox textBox3;
            private System.Windows.Forms.ErrorProvider errorProvider1;
            private System.Windows.Forms.Label label3;
            private System.Windows.Forms.Label label2;
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.Button button1;
        }
    }
    Le formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    using System.ComponentModel;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
     
            System.Collections.Generic.Dictionary<string, string> tests = new System.Collections.Generic.Dictionary<string, string>()
            {
                {@"^\d+$", "Au moins un chiffre et seulement un chiffre"},
                {@"^[a-z]+$", "Au moins une lettre et seulement une lettre"},
                {@"^\W+$", "Au moins un caractère mais NI un chiffre, NI une lettre"}
            };
     
            public Form1()
            {
                InitializeComponent();
                ActiveControl = textBox1;
            }
     
            private void InputValidating(object sender, CancelEventArgs e)
            {
                TextBox textBox = sender as TextBox;
                errorProvider1.SetError(textBox,
                    Regex.IsMatch(textBox.Text, (string)textBox.Tag) ? "" : tests[(string)textBox.Tag]);
                bool invalidInput = false;
                foreach (Control ctrl in this.Controls)
                {
                    if (((ctrl is TextBox) && string.IsNullOrEmpty((ctrl as TextBox).Text)) || errorProvider1.GetError(ctrl) != "")
                    {
                        invalidInput = true;
                        break;
                    }
                }
                button1.Enabled = !invalidInput;
            }
     
            private void Form1_Shown(object sender, System.EventArgs e)
            {
                errorProvider1.BlinkStyle = ErrorBlinkStyle.NeverBlink;
                bool invalidInput = false;
                foreach (Control ctrl in this.Controls)
                {
                    if (ctrl is TextBox)
                    {
                        InputValidating(ctrl, new CancelEventArgs());
                        invalidInput = invalidInput | (errorProvider1.GetError(ctrl) != "");
                    }
                }
                button1.Enabled = !invalidInput;
                errorProvider1.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;
            }
     
        }
    }
    Si tu veux, je peux t'envoyer le projet complet

  4. #4
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Pourquoi ne pas ajouter un bool à la classe du formulaire principale nommée par exemple fermetureEnCours qui prend comme valeur initiale false et prend la valeur true dans l'événement FormClosing. Quand fermetureEnCours == true on évite les testes de validation des données. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if(valeur_incorrect) {
            e.Cancel = true && !fermetureEnCours;
        }
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    En effet Papy, si je passe le e.Cancel sur false, cela me permet de fermer ma form...Mais en revanche mon errorProvider devient un simple indicateur d'erreur et ne me restreint en rien sur la bonne entrée d'un champ.
    Si je fonctionne comme ça, il faudrait que mon bouton de validation du formulaire soit lié a mon errorProvider, et ne soit "Enabled" que lorsqu'il n'y a aucune erreur dans ce cas.

    Vous savez comment faire ça ?

    emma.rida j'essaie ton idée mardi matin!


  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Citation Envoyé par lepierrot Voir le message
    Si je fonctionne comme ça, il faudrait que mon bouton de validation du formulaire soit lié a mon errorProvider, et ne soit "Enabled" que lorsqu'il n'y a aucune erreur dans ce cas.
    Si je ne me trompe pas, c'est justement ce que fait le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button1.Enabled = !invalidInput;
    (button1 porte mal son nom, je le reconnais :-) )

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Exact Désolé j'avais lu de travers!

    J'ai pas mal d'aller retour dans mon programme, et des panels qui s'affichent en fonction de la validité des valeurs de mes champs.. Et du coup, sans trop rentrer dans les détails, ça me complique un peu la tâche d'adopter cette méthode.

    Il n'y a pas une autre possibilité de vérifier la saisie sans interférer avec les fonctions essentielles de la form (Close() principalement)? Eventuellement forcer la fermeture ..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 24/04/2006, 13h00
  2. Réponses: 3
    Dernier message: 14/04/2006, 18h58
  3. Réponses: 2
    Dernier message: 03/02/2006, 15h12
  4. Evènement : Fermeture du formulaire
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 02/02/2006, 18h16
  5. Réponses: 8
    Dernier message: 28/12/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo