mercredi 16 juillet 2014

Tuto : Créer un contrôle Textbox n'autorisant que certains caractères (Regex ou expressions régulières)

 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é :

  1. Ajouter une nouvelle classe dans votre projet nommée "TextboxEx"
  2. Sélectionnez le code plus haut et collez-le dans votre classe "TextBoxEx" (écrasez le contenu !)
  3. Régénérez votre projet
  4. Passez en mode "Concepteur de vues" 
  5. Dans votre boite à outils sélectionnez le contrôle "TextBoxEx" puis faites-le glisser sur votre formulaire : 

  6. Enfin sélectionnez votre TexBox puis paramétrez les propriétés :
    - "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