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

Résolu
Mani035 Messages postés 4 Date d'inscription samedi 9 juillet 2016 Statut Membre Dernière intervention 14 mai 2018 - Modifié par jordane45 le 10/07/2016 à 02:10
Mani035 Messages postés 4 Date d'inscription samedi 9 juillet 2016 Statut Membre Dernière intervention 14 mai 2018 - 11 juil. 2016 à 17:50
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.



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.

2 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
11 juil. 2016 à 15:59
Bonjour

TextChanged est l'événement par défaut d'un TextBox, donc quand tu doubles click dessus VS abonne automatiquement une méthode comme tu l'as décrit.

Si tu veux abonner un autre événement
  • soit tu l'écris à la main, dès que tu auras taper += VS te proposeras t'écrire le reste à ta place moyennant deux appuis sur Tab.
  • soit en mode Design, tu prends la fenêtre des propriétés, il y a un petit éclair en haut, ça bascule en fenêtre des événements, tu cherches celui que tu veux, et tu doubles click dessus.


Pour Validating, je ne m'en suis jamais servi, et n'ai pas le temps de tester aujourd'hui.
1
Mani035 Messages postés 4 Date d'inscription samedi 9 juillet 2016 Statut Membre Dernière intervention 14 mai 2018
11 juil. 2016 à 17:50
MERCI !!
Enfin une réponse claire, précise et qui fonctionne (presque) à la question posée.
J'ai fait ce que tu as décrit en mode Design, et super ! ç'est tout bon. La vérification ne se fait que quand je quitte la textBox avec un TAB.
Le seul problème (mais ça, je vais chercher), c'est que le focus reste bloqué sur la textBox sur laquelle on fait le contrôle. Pour être plus précis, quand le format n'est pas bon, l'errorProvider affiche un message, mais on peut passer à un autre contrôle avec un TAB ou un click de souris. Quand on saisi une valeur exacte, le curseur reste bloqué sur le contrôle surveillé.

Mais l'essentiel, c'est que j'ai bien compris le processus de création de code sur événement.

En résumé :
Microsoft : 0/10
Toi : 10/10

Bravo et merci !
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
9 juil. 2016 à 21:00
Bonsoir,

Sur le lien msdn il y a écrit
If the CausesValidation property is set to false, the Validating and Validated events are suppressed.


As tu vérifié?

Pour tester une adresse mail, je te conseille d'utiliser une regex.
http://lgmorand.developpez.com/dotnet/regex/

Il y a meme une source ici qui permet de tester
http://codes-sources.commentcamarche.net/source/41969-tester-et-compiler-de-regex-sauvegarde-gestion-des-regex-en-xml
0
Mani035 Messages postés 4 Date d'inscription samedi 9 juillet 2016 Statut Membre Dernière intervention 14 mai 2018
11 juil. 2016 à 15:43
Bonjour Whismeril et merci de ta réponse.

Oui, évidemment, j'ai contrôlé la propriété CausesValidation, qui est correctement (et par défaut) placée à True.
Donc, le problème ne vient pas de là.

Le lien concernant les Regex est très intéressant. Un peu compliqué, mais très puissant.i
Je vais explorer cette solution, en attendant d'avoir une réponse à mon problème de base, qui est le fonctionnement de l'événement Control.Validating.
Cette fonction DOIT être exploitable, et je voudrais vraiment savoir comment l'implanter exactement.
Pourquoi l'événement _TextChanged fonctionne parfaitement (en fait, il apparaît automatiquement dans le code lorsque, en étant dans la Form qui contient le contrôle, j'appuie sur la touche Enter avec le focus sur la textBox, et VS ajoute une ligne dans le designer :

this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);

Mais je n'arrive pas à provoquer cette génération automatique avec l'événement _Validating. Comment faire ?
0
Rejoignez-nous