none
Validation d'un contôle au moyen de l'événement Control.Validating

    Question

  • Bonjour,

    Dans mon application, l'utilisateur doit remplir des textBox avec des valeurs décimales, qui sont ensuite enregistrées dans une base SQL Server.
    Je voudrais qu'un contrôle soit fait sur la valeur entrée dans les texBox, pour éviter des erreurs au moment de l'enregistrement dans la base.
    J'ai essayé d'utiliser l'événement Control.Validating, comme expliqué sur la page MSDN suivante :
    https://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.validating(v=vs.110).aspx
    Voici le code :

    private void textBox1_Validating(object sender,
         System.ComponentModel.CancelEventArgs e)
    {
       string errorMsg;
       if(!ValidEmailAddress(textBox1.Text, out errorMsg))
       {
          // Cancel the event and select the text to be corrected by the user.
          e.Cancel = true;
          textBox1.Select(0, textBox1.Text.Length);
          // Set the ErrorProvider error with the text to display.
          this.errorProvider1.SetError(textBox1, errorMsg);
       }
    }
    private void textBox1_Validated(object sender, System.EventArgs e)
    {
       // If all conditions have been met, clear the ErrorProvider of errors.
       errorProvider1.SetError(textBox1, "");
    }
    public bool ValidEmailAddress(string emailAddress, out string errorMessage)
    {
       // Confirm that the e-mail address string is not empty.
       if(emailAddress.Length == 0)
       {
          errorMessage = "e-mail address is required.";
             return false;
       }
       // Confirm that there is an "@" and a "." in the e-mail address, and in the correct order.
       if(emailAddress.IndexOf("@") > -1)
       {
          if(emailAddress.IndexOf(".", emailAddress.IndexOf("@") ) > emailAddress.IndexOf("@") )
          {
             errorMessage = "";
             return true;
          }
       }

       errorMessage = "e-mail address must be valid e-mail address format.\n" +
          "For example 'someone@example.com' ";
          return false;
    }

    J'ai copié/collé l'exemple dans une Form1 qui contient une textBox1 et un errorProvider1, mais rien ne se passe quand je quitte la textBox avec un Tab, ou un click de souris sur un autre contrôle (la méthode textBox1_Validating n'est jamais appelée).

    Où est mon erreur ? Que manque t'il à mon code ?
    Merci beaucoup de votre aide.

    PS : en attendant la réponse, j'ai remplacé l'événement textBox1_Validating par l'événement textBox1_TextChanged
    Voici le code pour une textBox :

    private void stockMiniTextBox_TextChanged(object sender, EventArgs e)
            {
                try
                {
                    int.Parse(stockMiniTextBox.Text);
                    errorProvider1.SetError(stockMiniTextBox, "");
                    errvalidstkmin = 0;
                }
                catch (FormatException)
                {
                    errorProvider1.SetError(stockMiniTextBox, "Le format n'est pas correct");
                    errvalidstkmin = 1;
                }
            }
    Mais cette solution ne me convient pas car chaque caractère est testé au fur et à mesure de la frappe.


    • Modifié Mani035 mercredi 6 juillet 2016 13:22
    mercredi 6 juillet 2016 13:17

Réponses

  • J'ai obtenu la réponse en postant ma question sur un autre forum.

    En réalité, pour que cela fonctionne, il ne suffit pas de copier/coller le code dans le programme. Il faut :

    1. Se positionner sur la textBox dans la Form

    2. Ouvrir la fenêtre de propriétés et cliquer sur l'icône "événements" (représentée par un éclair)

    3. En regard de l'événement recherché (ici, Validating), taper le nom de l'événement (ex. prixAchatTextBox_Validating)

    4. Dès lors, la méthode est automatiquement implantée dans le code ET le Designer

    Merci à codes-sources.com, où il y a des programmeurs chevronnés qui font l'effort de répondre à toutes les questions.

    • Marqué comme réponse Mani035 jeudi 14 juillet 2016 17:57
    lundi 11 juillet 2016 16:18

Toutes les réponses

  • Bonjour,

    Je préfère faire un contrôle au moment de la saisie.

    si vous avez quelques champs vous pouvez le faire sur l'évènement KeyUp de chaque champ et après que l'opérateur a tapé Entrée.

    Cela signifie, que sur CHAQUE CHAMP,
    l'opérateur doit rentré l'information demandée et terminer sa saisie par la FRAPPE DE LA TOUCHE ENTREE.

    C'est une contrainte qui est valable lorsqu'il y a quelques champs à saisir, au delà de 5 ou 6 il faut adopter une autre méthode.

    On contrôle la saisie lorsque l'opérateur à tapé tous les caractères, par exemple pour la conversion de texte en valeur double...

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {

           if (e.KeyCode != Keys.Enter)
             return;

     //Si l'opérateur a appuyer sur la touche Entrée
     //Faire les contrôles, conformité de l'adresse mail, conversion en entier, double           

     try
     {
        double l_Param = Convert.ToDouble(textBox1.Text);

        if (l_Param < 0.0)
           throw(new ApplicationException("Les valeurs négatives ne sont pas autorisée.");
                    
        if (l_Param > 25.0)
           throw(new ApplicationException("Le paramètre doit être inférieur à 25."));

        m_Erreur.Clear();
        BTNvalider.Enabled = true;
     }
     catch(Exception ex)
     {
        m_Erreur.SetError(textBox1, ex.Message);
        m_Erreur.SetIconAlignment(textBox1, ErrorIconAlignment.MiddleRight);
        BTNvalider.Enabled = false;
      }

    }

    Cordialement

    Gérard


    • Modifié GP79 mercredi 6 juillet 2016 14:06
    • Proposé comme réponse GP79 mercredi 6 juillet 2016 21:11
    • Non proposé comme réponse Mani035 jeudi 7 juillet 2016 10:00
    mercredi 6 juillet 2016 14:05
  • Bonjour et merci pour votre réponse. 

    C'est une proposition intéressante, mais qui malheureusement ne me convient pas. En effet : 

    1. Je trouve qu'il est trop contraignant pour l'utilisateur d'appuyer sur la touche Enter sur chaque contrôle, puis de faire un Tab pour passer au contrôle suivant. 

    2. La vraie question est : pourquoi l'événement Control.Validating ne fonctionne pas, et je n'ai pas d'explication. 

     

    Merci quand même, en espérant que quelqu'un pourra m'aider. 

    jeudi 7 juillet 2016 10:00
  • J'ai obtenu la réponse en postant ma question sur un autre forum.

    En réalité, pour que cela fonctionne, il ne suffit pas de copier/coller le code dans le programme. Il faut :

    1. Se positionner sur la textBox dans la Form

    2. Ouvrir la fenêtre de propriétés et cliquer sur l'icône "événements" (représentée par un éclair)

    3. En regard de l'événement recherché (ici, Validating), taper le nom de l'événement (ex. prixAchatTextBox_Validating)

    4. Dès lors, la méthode est automatiquement implantée dans le code ET le Designer

    Merci à codes-sources.com, où il y a des programmeurs chevronnés qui font l'effort de répondre à toutes les questions.

    • Marqué comme réponse Mani035 jeudi 14 juillet 2016 17:57
    lundi 11 juillet 2016 16:18
  • Etant donné que personne ne l'a fait, je valide moi-même ma propre réponse.

    Si quelqu'un à une info supplémentaire à ajouter, il sera le bienvenu. Merci

    jeudi 14 juillet 2016 17:57