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

Mani035 3 Messages postés samedi 9 juillet 2016Date d'inscription 11 juillet 2016 Dernière intervention - 9 juil. 2016 à 14:20 - Dernière réponse : Mani035 3 Messages postés samedi 9 juillet 2016Date d'inscription 11 juillet 2016 Dernière intervention
- 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.
Afficher la suite 

4 réponses

Répondre au sujet
Whismeril 11405 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 11 juil. 2016 à 15:59
+1
Utile
1
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.
Cette réponse vous a-t-elle aidé ?  
Mani035 3 Messages postés samedi 9 juillet 2016Date d'inscription 11 juillet 2016 Dernière intervention - 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 !
Commenter la réponse de Whismeril
Whismeril 11405 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 9 juil. 2016 à 21:00
0
Utile
1
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
Mani035 3 Messages postés samedi 9 juillet 2016Date d'inscription 11 juillet 2016 Dernière intervention - 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 ?
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.