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é ;-)
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.