Véritable maskeditbox en vb.net

Description

Enfin, un maskEditBox en VB.Net

il viens à 100% de moi
il gère pas mal tout juste des chiffres, n'importe quoi, des chiffre limité (maximum de 12 par exemple, donc 13 entrera pas)

il gère les backspace et les delete
il gère les copier collé

il crée même des label pour éviter d'affacer certain champs (comme une date les / ou les - doivent pas être affacé

il fonctionne de la même façon que celui de VB6.0, il faut simplement y mettre nu mask il automatique il se fabrique (même dans le compilateur avec le code non exécuté)

Source / Exemple :


Public Class MaskEditBox
    Inherits System.Windows.Forms.UserControl

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call
    End Sub

    'UserControl overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Private Label() As Object

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.SuspendLayout()
        Me.Name = "MaskEditBox"
        Me.Size = New System.Drawing.Size(270, 20)
        Me.ResumeLayout(False)

    End Sub

#End Region

    'Mon mask
    Private MaskVar As String = ""
    'La dernière touche entrée
    Private Key As Integer

    'Get et set pour mon mask
    Public Property Mask() As String
        Get
            Return MaskVar
        End Get
        Set(ByVal Value As String)

            '#Zone " Variable "
            Dim i As Integer
            Dim j As Integer = 0
            Dim dernier As String = ""
            '#End Zone
            MaskVar = Value
            '#Zone " Création des TextBox et Label "

            'Effacement
            Me.Controls.Clear()
            ReDim Label(Len(MaskVar) - 1)

            'Création
            For i = 1 To Len(MaskVar)
                'Si c'est la création
                If dernier <> Mid(MaskVar, i, 1) And Not (IsNumeric(dernier) And IsNumeric(Mid(MaskVar, i, 1))) Then
                    'TextBox
                    If Mid(MaskVar, i, 1) = "#" Or Mid(MaskVar, i, 1) = "a" Or Mid(MaskVar, i, 1) = "A" Or IsNumeric(Mid(MaskVar, i, 1)) Then
                        Me.Label(j) = New System.Windows.Forms.TextBox
                        Me.Label(j).AutoSize = False
                        Me.Label(j).TextAlign = System.Windows.Forms.HorizontalAlignment.Center
                        'Label
                    Else
                        Me.Label(j) = New System.Windows.Forms.Label
                        Me.Label(j).TextAlign = ContentAlignment.MiddleCenter
                    End If
                    Me.Label(j).TabIndex = i
                    Me.Label(j).Text = Mid(MaskVar, i, 1)

                    'Mes Tag
                    ReDim Me.Label(j).tag(4)
                    Me.Label(j).tag(0) = 1 'Nombre de caractère
                    Me.Label(j).tag(1) = "" 'Text par défaut
                    Me.Label(j).tag(2) = False 'Déjà entré dessus
                    Me.Label(j).tag(3) = j 'Sa position
                    Me.Label(j).tag(4) = Mid(MaskVar, i, 1) 'Son mask
                    Me.Controls.Add(Me.Label(j))

                    'garder en mémoire le dernier créer, pour pas le créé en double et seulement l'aggrandir
                    dernier = Mid(MaskVar, i, 1)
                    j += 1
                    'Sinon il est déjà créé, faut l'aggrandir plutot
                Else

                    'Aggrandir le textbox ou label
                    ReDim Preserve Label(UBound(Label) - 1)
                    Me.Label(j - 1).Width += Me.Width / (Len(MaskVar) + 1)
                    Me.Label(j - 1).Text += Mid(MaskVar, i, 1)
                    Me.Label(j - 1).tag(0) += 1
                    Me.Label(j - 1).tag(4) &= Mid(MaskVar, i, 1)
                End If
            Next i

            'Redimentionner les controls
            OnResize(Nothing)

            'Ajouter les évênement
            'Je le met après, puisque je dois initialiser les controls, sinon ça fais des bugs avec le TextChanged
            For i = 0 To UBound(Label)
                If Label(i).GetType.ToString = "System.Windows.Forms.TextBox" Then
                    Select Case Mid(Label(i).text, 1, 1)
                        Case "#"
                            AddHandler CType(Me.Label(i), TextBox).TextChanged, New EventHandler(AddressOf ValiderChiffre)
                        Case "a"
                            AddHandler CType(Me.Label(i), TextBox).TextChanged, New EventHandler(AddressOf ValiderMinuscule)
                        Case "A"
                            AddHandler CType(Me.Label(i), TextBox).TextChanged, New EventHandler(AddressOf ValiderMajuscule)
                        Case Else
                            AddHandler CType(Me.Label(i), TextBox).TextChanged, New EventHandler(AddressOf ValiderChiffreFixe)
                    End Select
                    AddHandler CType(Me.Label(i), TextBox).GotFocus, New EventHandler(AddressOf TextBox1_GotFocus)
                    AddHandler CType(Me.Label(i), TextBox).KeyPress, New KeyPressEventHandler(AddressOf TextBox1_KeyPress)
                Else
                    AddHandler CType(Me.Label(i), Label).GotFocus, New EventHandler(AddressOf label_GotFocus)
                End If
            Next i
            '#End Zone
        End Set
    End Property

    'Si on redimentionne le maskEditBox, faut que les controls suivent
    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
        Dim i As Integer
        Dim position As Double = 0
        Dim changement As Double
        changement = Me.Width / Len(Mask)
        Try
            For i = 0 To UBound(Label)
                Label(i).width = changement * Label(i).tag(0)
                Label(i).left = position
                Label(i).Height = Me.Height
                position += Label(i).width
            Next i
        Catch
        End Try
    End Sub

    'Regarder la touche appuyer pour gérer les backspaces et les espaces
    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If sender.text = "" And Asc(e.KeyChar) = 8 Then
            If sender.tag(3) <> 0 Then
                Label(sender.tag(3) - 1).Focus()
            End If
            Key = Asc(e.KeyChar)
        ElseIf e.KeyChar = " " Then
            e = Nothing
        Else
            Key = Asc(e.KeyChar)
        End If
    End Sub

    'Si on arrive pour la première fois dessus, effacer le mask
    Private Sub TextBox1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
        If Not sender.tag(2) Then
            sender.text = ""
            sender.tag(2) = True
        End If
    End Sub

    'Géré le retour en arrière ou avancer, puisqu'on peut pas rester sur un label
    Private Sub label_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
        If Key <> 8 Then
            If UBound(Label) > sender.tag(3) Then
                Label(sender.tag(3) + 1).Focus()
            ElseIf sender.tag(3) <> 0 Then
                Label(sender.tag(3) - 1).Focus()
            End If
        ElseIf sender.tag(3) <> 0 Then
            Label(sender.tag(3) - 1).Focus()
        End If
    End Sub

    'Valider les chiffres avec un maximum
    Private Sub ValiderChiffreFixe(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim temp As Long
        Dim i As Integer
        Try
            'Valider si c'est un chiffre, sinon il plante
            temp = sender.text

            'Vérifier la longueur de la chaine
            If Len(sender.text) > sender.tag(0) Then
                sender.text = sender.tag(1)

                'Si on dépace pas la limite
            ElseIf temp > sender.tag(4) Then
                sender.text = sender.tag(1)
                MsgBox("La valeur maximal est de : " & sender.tag(4), MsgBoxStyle.Critical, "erreur à l'usager")
                'Sinon ajouter
            Else
                sender.tag(1) = sender.text
                'Vérifier si on dois changer de textbox
                If Len(sender.text) = sender.tag(0) And UBound(Label) > sender.tag(3) Then
                    Label(sender.tag(3) + 1).Focus()
                End If
            End If
        Catch
            'Erreur, l'entré est pas une chiffre
            If sender.text <> "" Then
                sender.text = sender.tag(1)
                'Vider le textbox
            Else
                sender.tag(1) = ""
            End If
        End Try
    End Sub

    'Pareil que ValiderChiffreFixe
    Private Sub ValiderChiffre(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim temp As Long
        Dim i As Integer
        Try
            temp = sender.text
            If Len(sender.text) > sender.tag(0) Then
                sender.text = sender.tag(1)

            Else
                sender.tag(1) = sender.text
                If Len(sender.text) = sender.tag(0) And UBound(Label) > sender.tag(3) Then
                    Label(sender.tag(3) + 1).Focus()
                End If
            End If
        Catch
            If sender.text <> "" Then
                sender.text = sender.tag(1)
            Else
                sender.tag(1) = ""
            End If
        End Try
    End Sub

    'Aucune validation
    'Mettre en minuscule à la fin
    'Vérifier la limite du textbox pour passer au suivant
    Private Sub ValiderMinuscule(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim i As Integer
        If Len(sender.text) > sender.tag(0) Then
            sender.text = sender.tag(1)

        Else
            sender.tag(1) = sender.text
            If Len(sender.text) = sender.tag(0) And UBound(Label) > sender.tag(3) Then
                Label(sender.tag(3) + 1).Focus()
            End If
        End If
        sender.text = LCase(sender.text)
    End Sub

    'Aucune validation
    'Mettre en majuscule à la fin
    'Vérifier la limite du textbox pour passer au suivant
    Private Sub ValiderMajuscule(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim i As Integer
        If Len(sender.text) > sender.tag(0) Then
            sender.text = sender.tag(1)
        Else
            sender.tag(1) = sender.text
            If Len(sender.text) = sender.tag(0) And UBound(Label) > sender.tag(3) Then
                Label(sender.tag(3) + 1).Focus()
            End If
        End If
        sender.text = UCase(sender.text)
    End Sub

    'Permet d'ajouter une valeur
    Public Sub setValeur(ByVal valeur As String)
        Dim i As Integer
        Dim j As Integer = 1
        Try
            For i = 0 To UBound(Label)
                If Label(i).GetType.ToString = "System.Windows.Forms.TextBox" Then
                    Label(i).text = Mid(valeur, j, Label(i).tag(0))
                    j += Label(i).tag(0)
                End If
            Next i
        Catch
        End Try
    End Sub

    'Permet de remettre à 0
    Public Sub reset()
        Dim i As Integer
        For i = 0 To UBound(Label)
            If Label(i).GetType.ToString = "System.Windows.Forms.TextBox" Then
                Label(i).text = Label(i).tag(4)
                Label(i).tag(2) = False
            End If
        Next i
    End Sub

    'Permet de savoir si le control est remplis à 100%
    Public Function isFull() As Boolean
        isFull = True
        Dim i As Integer
        For i = 0 To UBound(Label)
            If Label(i).GetType.ToString = "System.Windows.Forms.TextBox" Then
                If Len(Label(i).text) <> Label(i).tag(0) Then
                    isFull = False
                End If
            End If
        Next i
    End Function

    'Recevoir la valeur, mais sans le mask
    'ex: (555) 555-5555 vas donner 5555555555
    Public Function getValeur() As String
        Dim i As Integer
        For i = 0 To UBound(Label)
            If Label(i).GetType.ToString = "System.Windows.Forms.TextBox" Then
                getValeur += Label(i).text
            End If
        Next i
    End Function

    'Recevoir la valeur, mais avec le mask
    'ex: (555) 555-5555 vas donner (555) 555-5555
    Public Function getValeurFull() As String
        Dim i As Integer
        For i = 0 To UBound(Label)
            getValeurFull += Label(i).text
        Next i
    End Function
End Class

Conclusion :


il est pas très compliquer a comprendre et bien documenté en plus

des commentaire est toujours apprécié ;-)

Codes Sources

A voir également

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.