Contrôle textbox validateur

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 743 fois - Téléchargée 16 fois

Contenu du snippet

Ce contrôle sert à valider les données entrées dans un textbox selon se que l'on veut valider.
-Validation d'entier
-Validation de nombre à virgule
-Validation de texte alphanumérique
-Validation de texte
-Validation de date
-Validation de # de téléphone (Canada)
-Validation de courriel
-Validation de carte de crédit
-Validation de code postal (Québec)
-Validation de numéro assurance social (Canada)

Pour c'est champs, il est possible de «setter» une valeur minimal et maximal
-Entier
-Nombre virgule
-Date

Il y a une validation logique d'effectuer sur les max et min en fonction du type de validation

-On peut binder le textbox
-modifier les couleurs initial, lors d'erreur

et plus encore!

Source / Exemple :


/*
    Auteur : Raphaël A.
    Commentaire : Controle de validation de donnée
 
    Révisions et Modifications
    ---------------------------------------------------
    Date		            Par			        Commentaires      

  • 26 octobre Raphaël A. -Champ préremplis, couleur
  • du backcolor quand erreur
  • et couleur de l'écriture
  • quand erreur, modification
  • du nom ddes propriétés pour
  • les regrouper au même endroit
  • /
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Text.RegularExpressions; namespace TextBoxValidator { public partial class TextboxValidator : UserControl { #region DECLARATION public enum enumTypeValidation {Entier, Nombre_virgule, Alphanumerique, Texte, Date, Adresse, TelephoneCanada, Courriel, CarteCredit, CodePostalQuebec, NASCanada}; private Regex regAlphanumerique = new Regex(@"^[\w]+$"); private Regex regTexte = new Regex(@"^[^0-9]+$"); private Regex regAdresse = new Regex(@"^[0-9]{1,5}([, -]?[a-bA-Z]{1,3})?[, -]{1}[\w -]+([, -]{1}[#]?[\w]{1,4})?$"); private Regex regTelephoneCanada = new Regex("^[1]?[ -]?[(]?[0-9]{3}[)]?[ -]?[0-9]{3}[ -]?[0-9]{4}$"); private Regex regCourriel = new Regex(@"^(([^<>()[\]\\.,;:\s@\""]+" + @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@" + @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" + @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+" + @"[a-zA-Z]{2,}))$"); private Regex regCarteCredit = new Regex("^[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}$"); private Regex regCodePostalQuebec = new Regex("^[a-zA-Z]{1}[0-9]{1}[a-zA-Z]{1}[, -]?[0-9]{1}[a-zA-Z]{1}[0-9]{1}$"); private Regex regNASCanada = new Regex("^[0-9]{3}[, -]?[0-9]{3}[, -]?[0-9]{3}$"); private int starter = 0; private bool ilYAUneErreur = true; #endregion public TextboxValidator() { InitializeComponent(); } #region PROPRIETES public enumTypeValidation typeValidation = enumTypeValidation.Entier; private Boolean valeurRequise = true; private string min = "0"; private string max = "0"; private Color backColorTextBox = Color.LightSteelBlue; private Color foreColorTextBox = Color.DarkBlue; private Color foreColorLabel = Color.Red; private bool bloquerUtilisateur = false; private Char caractereErreur = '*'; private Color backColorTexteBoxErreur = Color.LightPink; private Color foreColorTexteBoxErreur = Color.DarkBlue; #endregion #region ACCESSEUR public enumTypeValidation CtrlTypeValidation { get { return typeValidation; } set { typeValidation = value; switch (typeValidation) { case enumTypeValidation.Adresse: txtTexte.Text = "Aucune"; break; case enumTypeValidation.Alphanumerique: txtTexte.Text = "Aucun"; break; case enumTypeValidation.CarteCredit: txtTexte.Text = "9999-9999-9999-9999"; break; case enumTypeValidation.CodePostalQuebec: txtTexte.Text = "J1J 1J1"; break; case enumTypeValidation.Courriel: txtTexte.Text = "aucune@aucune.com"; break; case enumTypeValidation.Date: txtTexte.Text = DateTime.Now.ToString(); break; case enumTypeValidation.Entier: txtTexte.Text = "0"; break; case enumTypeValidation.NASCanada: txtTexte.Text = "999 999 999"; break; case enumTypeValidation.Nombre_virgule: txtTexte.Text = "0,00"; break; case enumTypeValidation.TelephoneCanada: txtTexte.Text = "1 555-555-5555"; break; case enumTypeValidation.Texte: txtTexte.Text = "Aucun"; break; default: txtTexte.Text = "Aucun"; break; } starter = 1; CtrlMax = CtrlMax; CtrlMin = CtrlMin; } } [Description("Indique si une valeur est obligatoire")] public Boolean CtrlValeurRequise { get { return valeurRequise; } set { valeurRequise = value; if (!valeurRequise) ilYAUneErreur = false; } } [Description("Indique la valeur minimale")] public string CtrlMin { get { return min; } set { int bidonInt = 0; double bidonDouble = 0; DateTime bidonDateTime = DateTime.Now; min = value; if (typeValidation == enumTypeValidation.Entier) if (!int.TryParse(min, out bidonInt) && starter == 1) min = "0"; if (typeValidation == enumTypeValidation.Nombre_virgule) if (!double.TryParse(min, out bidonDouble) && starter == 1) min = "0,00"; if (typeValidation == enumTypeValidation.Date) if (!DateTime.TryParse(min, out bidonDateTime) && starter == 1) min = "null"; if (CtrlTypeValidation == enumTypeValidation.Texte || CtrlTypeValidation == enumTypeValidation.Alphanumerique || CtrlTypeValidation == enumTypeValidation.Adresse || CtrlTypeValidation == enumTypeValidation.TelephoneCanada || CtrlTypeValidation == enumTypeValidation.Courriel || CtrlTypeValidation == enumTypeValidation.CarteCredit || CtrlTypeValidation == enumTypeValidation.CodePostalQuebec || CtrlTypeValidation == enumTypeValidation.NASCanada && starter == 1) min = "0"; } } [Description("Indique la valeur maximale")] public string CtrlMax { get { return max; } set { int bidonInt = 0; double bidonDouble = 0; DateTime bidonDateTime = DateTime.Now; max = value; if (CtrlTypeValidation == enumTypeValidation.Entier) if (!int.TryParse(max, out bidonInt) && starter == 1) max = "0"; if (CtrlTypeValidation == enumTypeValidation.Nombre_virgule) if (!double.TryParse(max, out bidonDouble) && starter == 1) max = "0,00"; if (CtrlTypeValidation == enumTypeValidation.Date) if (!DateTime.TryParse(max, out bidonDateTime) && starter == 1) max = "null"; if (CtrlTypeValidation == enumTypeValidation.Texte || CtrlTypeValidation == enumTypeValidation.Alphanumerique || CtrlTypeValidation == enumTypeValidation.Adresse || CtrlTypeValidation == enumTypeValidation.TelephoneCanada || CtrlTypeValidation == enumTypeValidation.Courriel || CtrlTypeValidation == enumTypeValidation.CarteCredit || CtrlTypeValidation == enumTypeValidation.CodePostalQuebec || CtrlTypeValidation == enumTypeValidation.NASCanada && starter == 1) max = "0"; } } [Description("Indique la couleur de fond du TextBox")] public Color CtrlBackColorTextBox { get { return backColorTextBox; } set { backColorTextBox = value; txtTexte.BackColor = backColorTextBox; } } [Description("Indique la couleur de l'écriture du TextBox")] public Color CtrlForeColorTextBox { get { return foreColorTextBox; } set { foreColorTextBox = value; txtTexte.ForeColor = foreColorTextBox; } } [Description("Indique la couleur de l'écriture du label")] public Color CtrlForeColorLabel { get { return foreColorLabel; } set { foreColorLabel = value; lblAvertissement.ForeColor = foreColorLabel; } } [Description("Indique si en cas d'erreur, l'utilisateur peut sortir du controle")] public bool CtrlBloquerUtilisateur { get { return bloquerUtilisateur; } set { bloquerUtilisateur = value; } } [Description("Caractère à afficher lorsqu'il y a une erreur")] public Char CtrlCaractereErreur { get { return caractereErreur; } set { caractereErreur = (value == ' ') ? '*' : value; } } [Description("Indique la couleur de fond du TextBox lorsqu'il y a une erreur")] public Color CtrlBackColorTexteBoxErreur { get { return backColorTexteBoxErreur; } set { backColorTexteBoxErreur = value; } } [Description("Indique la couleur de l'écriture du TextBox lorsqu'il y a une erreur")] public Color CtrlForeColorTexteBoxErreur { get { return foreColorTexteBoxErreur; } set { foreColorTexteBoxErreur = value; } } #endregion #region FONCTIONNALITE_EXTERNE private void txtTexte_Validating(object sender, CancelEventArgs e) { int bidonInt; double bidonDouble; DateTime bidonDateTime; bool passeLeTest = false; if (CtrlValeurRequise) { if (CtrlTypeValidation == enumTypeValidation.Entier && int.TryParse(txtTexte.Text, out bidonInt)) { passeLeTest = true; if (int.Parse(CtrlMax) != 0 | int.Parse(CtrlMin) != 0) { if (int.Parse(txtTexte.Text) > int.Parse(CtrlMax) || int.Parse(txtTexte.Text) < int.Parse(CtrlMin)) passeLeTest = false; } } if (CtrlTypeValidation == enumTypeValidation.Nombre_virgule && double.TryParse(txtTexte.Text, out bidonDouble)) { passeLeTest = true; if (double.Parse(CtrlMax) != 0 | double.Parse(CtrlMin) != 0) { if (double.Parse(txtTexte.Text) > double.Parse(CtrlMax) || double.Parse(txtTexte.Text) < double.Parse(CtrlMin)) passeLeTest = false; } } if (CtrlTypeValidation == enumTypeValidation.Alphanumerique && regAlphanumerique.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.Texte && regTexte.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.Date && DateTime.TryParse(txtTexte.Text, out bidonDateTime)) { passeLeTest = true; if (CtrlMax != "null" || CtrlMin != "null") { if (CtrlMin != "null" && DateTime.Parse(txtTexte.Text).CompareTo(DateTime.Parse(CtrlMin)) == -1) passeLeTest = false; if (CtrlMax != "null" && DateTime.Parse(txtTexte.Text).CompareTo(DateTime.Parse(CtrlMax)) == 1) passeLeTest = false; } } if (CtrlTypeValidation == enumTypeValidation.Adresse && regAdresse.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.TelephoneCanada && regTelephoneCanada.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.Courriel && regCourriel.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.CarteCredit && regCarteCredit.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.CodePostalQuebec && regCodePostalQuebec.IsMatch(txtTexte.Text)) passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.NASCanada && regNASCanada.IsMatch(txtTexte.Text)) passeLeTest = true; } //Si la valeur n'Est pas requise et que le champ de texte vaux rien, //on insère une valeur par défaut if (!CtrlValeurRequise) { passeLeTest = true; if (CtrlTypeValidation == enumTypeValidation.Entier && !int.TryParse(txtTexte.Text, out bidonInt)) txtTexte.Text = "0"; if (CtrlTypeValidation == enumTypeValidation.Nombre_virgule && !double.TryParse(txtTexte.Text, out bidonDouble)) txtTexte.Text = "0.00"; if (CtrlTypeValidation == enumTypeValidation.Alphanumerique && !regAlphanumerique.IsMatch(txtTexte.Text)) txtTexte.Text = "Aucun"; if (CtrlTypeValidation == enumTypeValidation.Texte && !regTexte.IsMatch(txtTexte.Text)) txtTexte.Text = "Aucun"; if (CtrlTypeValidation == enumTypeValidation.Date && !DateTime.TryParse(txtTexte.Text, out bidonDateTime)) txtTexte.Text = DateTime.Now.ToString(); if (CtrlTypeValidation == enumTypeValidation.Adresse && !regAdresse.IsMatch(txtTexte.Text)) txtTexte.Text = "Aucune"; if (CtrlTypeValidation == enumTypeValidation.TelephoneCanada && !regTelephoneCanada.IsMatch(txtTexte.Text)) txtTexte.Text = "1 555-555-5555"; if (CtrlTypeValidation == enumTypeValidation.Courriel && !regCourriel.IsMatch(txtTexte.Text)) txtTexte.Text = "aucune@aucune.com"; if (CtrlTypeValidation == enumTypeValidation.CarteCredit && !regCarteCredit.IsMatch(txtTexte.Text)) txtTexte.Text = "9999-9999-9999-9999"; if (CtrlTypeValidation == enumTypeValidation.CodePostalQuebec && !regCodePostalQuebec.IsMatch(txtTexte.Text)) txtTexte.Text = "J1J-1J1"; if (CtrlTypeValidation == enumTypeValidation.NASCanada && !regNASCanada.IsMatch(txtTexte.Text)) txtTexte.Text = "999 999 999"; } //Vérifie si la donnée entré correspond au critère d'acceptation if (passeLeTest) { txtTexte.BackColor = CtrlBackColorTextBox; txtTexte.ForeColor = CtrlForeColorTextBox; lblAvertissement.Text = ""; ilYAUneErreur = false; if (CtrlBloquerUtilisateur) e.Cancel = false; } else { txtTexte.BackColor = CtrlBackColorTexteBoxErreur; txtTexte.ForeColor = CtrlForeColorTexteBoxErreur; lblAvertissement.Text = CtrlCaractereErreur.ToString(); ilYAUneErreur = true; if (CtrlBloquerUtilisateur) e.Cancel = true; } } private void txtTexte_DoubleClick(object sender, EventArgs e) { txtTexte.Clear(); } public void binder(string PropertyString, object objet, string Property) { txtTexte.DataBindings.Add(new Binding(PropertyString, objet, Property)); } public void binder(object objet, string Property) { txtTexte.DataBindings.Add(new Binding("Text", objet, Property)); } public void passwordChar(Char caractere) { txtTexte.PasswordChar = caractere; } public string getText() { return txtTexte.Text; } public bool getIlYAUneErreur() { return ilYAUneErreur; } #endregion } }

Conclusion :


En espérant que ce contrôle vous serve!

Bonne prog ;)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

bonjour,

pourquoi ne pas creer une classe textetbouton qui contient un textbox et eventuellement un bouton, on les abonne aux evenements.
dans ta classe:
this.toncontrole += new System.EventHandler(this.tafonction);

comme ca dans ton formulaire tu declare
textebouton moncontrol = new textebouton(textbox1,button1);

et tu a ton boutton et les evenements test valeurs par defaut et tout en une ligne, tu peux faire ca avec un seul control ou plusieur comme par exemple un scroll + tous les textbox d'un formulaire ou une case a cocher et un textbox... selon ta maniere de coder cela peut etre tres evolutif.

en plus c'est tres bien pour les feneants on place ses controles une fois et en une ligne on leur affecte des fonctions
Messages postés
61
Date d'inscription
mardi 1 février 2005
Statut
Membre
Dernière intervention
28 mai 2012
1
Ce contrôle devrait peut-être présenter des options validation avec des valeurs par défaut.

txtValid.Validation = TRUE [sinon toute validation est ignorée]
txtValid.ValMax = 1700
txtValid.ValMin = 0

txtValid.TelephoneNoMask = [et ici mettre une liste "intellisense" avec possibilité de rajouter ce qui manque]

A l'extrème même valider des no de carte de crédit.

Bel effort!
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
pour moi, le textbox est une zone de saisie. point.
si tu commences à mettre de la logique dans ton textbox tu vas au devant de problèmes d'évolutivités.

-> tu veux pouvoir saisir que des chiffres : tu crées un composant "IExtenderProvider"

l'idée est simple : il faut que ton application reste à la fois : simple et évolutive. tu serais surpris de voir tout ce qu'on peut faire avec les contrôles standards du framework.
Messages postés
22
Date d'inscription
vendredi 11 novembre 2005
Statut
Membre
Dernière intervention
23 septembre 2014

Je suis d'accord dans le fait que c'est figé mais en même temps il s'agit d'un contrôle spécialisé donc on pourrait par exemple faire un contrôle spécialisé nombre qui fasse la validation des nombres (numérique, à virgule, ...), un contrôle qui valide des numéros de téléphones avec prise en charge native (=directement intégré) des numéros français, canadiens, et plus. Et ainsi de suite.

Rien n'empêche d'utiliser des Validators dans le contrôle spécialisé. Et il ne faut pas dire, le contrôle ne doit pas faire la validation. Il s'agit là purement d'un point de vue et non d'une règle de programmation en soit. Si le contrôle est destiné à un usage bien spécifique alors il peut embarquer sa propre validation afin de mieux cadrer son domaine d'utilisation. Si tu ne veux pas intégrer la validation, autant prendre le textbox simple et utiliser les validators mais le but de prendre ce genre de contrôle c'est justement de s'affranchir de ces développements répétitifs.

monsieurx12: l'idée est bonne comme je le disais mais la remarque de sebmafate sur le fait que ton contrôle est figé est exacte. Il faut que tu sépares les différents domaines d'applications et permettre également de pouvoir les étendre pour ceux qui en ont besoin notamment pour les numéros de téléphones. ;-)

Si tu as des questions sur ce point n'hésites pas à demander
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Oui... et non !

Oui, car l'idée de pouvoir valider automatiquement la saisie est intéressante...
Non, car c'est trop "figer" ! Comment, je fais demain si je veux pouvoir valider un numéro de téléphone français ? je modifie le contrôle ?
De plus, pour moi, ce n'est pas au contrôle lui-même de valider le contenu mais à un objet "spécialisé"... Microsoft utilise en ASP.net des contrôles Validator, il faut autant que faire se peut transposer l'idée en Windows Forms (http://www.csharpfr.com/codes/WINDOWS-FORMS-VALIDATORS_43575.aspx)

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.