Créer un contrôle TextBox n'autorisant que certains caractères (Regex ou expressions régulières)
Il devient parfois difficilement maintenable de toujours placer du code dans les gestionnaires d’événement du formulaire principal d'une application.
Dans le cas particulier ou nous souhaiterions interdire la saisie de certains caractères dans une TextBox (dans notre exemple : LTextBox2) il nous faudrait alors utiliser les 2 gestionnaires d’événement suivants :
Private Sub LTextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles LTextBox2.KeyPress If Not Char.IsControl(e.KeyChar) AndAlso Not IsNumeric(e.KeyChar) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> " " Then e.Handled = True MessageBox.Show("Valeur numérique uniquement !") End If End Sub Private Sub LTextBox2_TextChanged(sender As Object, e As EventArgs) Handles LTextBox2.TextChanged For Each c As Char In LTextBox2.Text.ToCharArray If Not IsNumeric(c) AndAlso c <> "." AndAlso c <> " " Then LTextBox2.Text = LTextBox2.Text.Replace(c, String.Empty) MessageBox.Show("Valeur numérique uniquement !") End If Next End Sub
Cet exemple extrait de ce billet autorise uniquement la saisie de caractères alphanumériques !
On se rends vite compte que l'implémentation de plusieurs TextBox deviendrait très difficilement maintenable !
En m'inspirant de cet exemple j'ai développé (en toute modestie) un petit contrôle hérité qui permet de vérifier lors de la saisie si les caractères entrés par l'utilisateur sont correctes selon le pattern Regex que le développeur aura placé dans la propriété adequate du contrôle "TextBoxEx".
Le contrôle TextBoxEx :
Imports System Imports System.ComponentModel Imports System.Data Imports System.Drawing Imports System.Text Imports System.Windows.Forms Imports System.Text.RegularExpressions Partial Public Class TextBoxEx Inherits TextBox #Region " Declarations " Private m_errorProvider As ErrorProvider = Nothing Private m_useRegularExpressionRegex As Regex = Nothing #End Region #Region " Properties " Private _UseRegularExpressionPattern As String Public Property UseRegularExpressionPattern() As String Get Return _UseRegularExpressionPattern End Get Set(ByVal value As String) If value IsNot Nothing Then m_useRegularExpressionRegex = New Regex(value, RegexOptions.Compiled) _UseRegularExpressionPattern = value End Set End Property Public Property UseRegularExpression As Boolean Public Property UseRegularExpressionErrorMessage As String #End Region #Region " Constructor " Public Sub New() m_errorProvider = New ErrorProvider End Sub #End Region #Region " Methods " Protected Overrides Sub OnValidating(e As CancelEventArgs) 'OnValidating est déclenché lorsqu'on clique sur un autre contrôle dans la zone cliente du formulaire MyBase.OnValidating(e) SetErrorProvider() End Sub Protected Overrides Sub OnTextChanged(e As EventArgs) 'OnTextChanged est déclenché lorsqu'un caractère est saisi dans la textbox. MyBase.OnTextChanged(e) SetErrorProvider() End Sub Private Sub SetErrorProvider() If UseRegularExpression And UseRegularExpressionPattern IsNot Nothing Then 'On appelle la Fonction qui permet de vérifier l'exactitude des caractères saisis dans la textbox If ValidateControl() = False Then 'Me.Text = String.Empty If Not Me.Text.Length = 0 Then Me.Text = Me.Text.Substring(0, Me.Text.Length - 1) Me.Select(Me.Text.Length, 0) End If 'ErrorProvider affiche une infobulle rouge à droite de la textbox. m_errorProvider.SetError(Me, UseRegularExpressionErrorMessage) Else 'La saisie est valide donc rien n'est affiché dans ErrorProvider m_errorProvider.SetError(Me, String.Empty) End If End If End Sub Private Function ValidateControl() As Boolean ' Si le pattern est bon alors on vérifie que le texte tapé correspond au pattern Return m_useRegularExpressionRegex.IsMatch(Me.Text) End Function #End Region End Class
Comment utiliser ce contrôle hérité :
- Ajouter une nouvelle classe dans votre projet nommée "TextboxEx"
- Sélectionnez le code plus haut et collez-le dans votre classe "TextBoxEx" (écrasez le contenu !)
- Régénérez votre projet
- Passez en mode "Concepteur de vues"
- Dans votre boite à outils sélectionnez le contrôle "TextBoxEx" puis faites-le glisser sur votre formulaire :
-
- "UseRegularExpressionPattern" avec le pattern : ^[0-9\b]+$ (ou le pattern RegEx que vous voulez)
- "UseRegularExpression" à True
- "UseRegularExpressionErrorMessage" avec la valeur Vous devez saisir uniquement des chiffres !
..... comme suit :
7. Voilà en image le résultat lorsque l'utilisateur tape un caractère alphabétique et non alphanumérique comme le préconise le pattern RegEx au dessus :
Aucun commentaire:
Enregistrer un commentaire