Ce textbox permet la saisie de nombre uniquement. Plusieurs options :
- nb de decimal
- symbole avant ou apres le nombre
- si on affiche les "0" inutile ou pas celon le nb de decimal
Source / Exemple :
Public Class Textbox_num
Inherits TextBox
#Region "Propriété"
#Region "My_NB_Decimal"
'l'utilisateur peut choisir le nombre de decimal du nombre
Private _My_NB_Decimal As Integer
Property My_NB_decimal() As Integer
Get
Return _My_NB_Decimal
End Get
Set(ByVal value As Integer)
_My_NB_Decimal = value
End Set
End Property
#End Region
#Region "My_Symbole"
'l'utilisateur peut choisir le symbole a afficher apres ou avant le nombre
Private _My_Symbole As String
Property My_Symbole() As String
Get
Return _My_Symbole
End Get
Set(ByVal value As String)
_My_Symbole = value
End Set
End Property
#End Region
#Region "My_Symbole_Place"
Enum Place
Avant 'le symbole se trouve avant le nombre
Apres 'le symbole se trouve apres le nombre
End Enum
Private _My_Symbole_Place As Place
Property My_Symbole_Place() As Place
Get
Return _My_Symbole_Place
End Get
Set(ByVal value As Place)
_My_Symbole_Place = value
End Set
End Property
#End Region
#Region "My_Affiche_0_Inutile"
Private _My_Affiche_0_Inutile As Boolean
Property My_Affiche_0_Inutile() As Boolean
Get
Return _My_Affiche_0_Inutile
End Get
Set(ByVal value As Boolean)
_My_Affiche_0_Inutile = value
End Set
End Property
#End Region
#End Region
#Region "Fonction"
#Region "Séparateur decimal"
Function My_separateur_decimal() As String
'Pour avoir le séparateur decimal celon les paramètres utilisateurs
Return Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
End Function
#End Region
#Region "Partie du nombre"
Enum Partie
Entière 'retourne la partie entière du nombre
Décimal 'retourne la partie decimal du nombre
End Enum
'renvoie la partie decimal ou entière, celon le choix, du nombre
Function My_NB_partie(ByVal nb As String, ByVal Part As Partie) As String
Try
If Trim(nb) = "" Then 'si il n'y a rien a retourner
nb = 0
Return nb
Exit Function
End If
nb = Replace(nb, My_Symbole, "")
Dim i As Integer 'pour la boucle
Dim chaine As String = "" 'a retourner
For i = 1 To nb.Length 'boucle testant caractère par caractère
Dim ch As String = Mid(nb, i, 1) 'extrait un caractère
If Part = Partie.Entière Then
If ch = My_separateur_decimal() Then
'si on arrive à la partie décimal on quitte
Exit For
Else
'autrement on ajoute le caractère
chaine &= ch
End If
ElseIf Part = Partie.Décimal Then
If ch = My_separateur_decimal() Then
chaine = ""
Else
chaine &= ch
End If
End If
Next
Return chaine
Catch ex As Exception
Return ""
End Try
End Function
#End Region
#Region "Compte le nombre d'occurence d'un caractère"
Function My_Compte_Char(ByVal charactere As String) As Integer
Dim nb As Integer = 0
If Trim(Me.Text) = "" Then
Return nb
Exit Function
End If
Dim i As Integer
For i = 1 To Me.Text.Length
Dim ch As String = Mid(Me.Text, i, 1)
If ch = charactere Then
nb += 1
End If
Next
Return nb
End Function
#End Region
#End Region
#Region "Méthode"
Private Sub textbox_numerique_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter
If Me.Text = "" Then Exit Sub 'si il n'y a rien
If _My_Symbole = "" Then Exit Sub 'si il n'y a pas de symbole a enlever
Me.Text = Replace(Me.Text, My_Symbole, "") 'on enlève le symbole
Me.Text = Trim(Me.Text) 'on enlève les espaces occasionnel
End Sub
Private Sub textbox_numerique_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
'retour arrière -> on laisse faire donc on quitte la sub
If AscW(e.KeyChar) = 8 Then Exit Sub
'si on appuie sur entrée on passe au controle suivant
If Asc(e.KeyChar) = 10 Or Asc(e.KeyChar) = 13 Then SendKeys.Send(vbTab)
'si non numérique -> on empêche la saisie et on quitte
If Not (e.KeyChar = "0" OrElse e.KeyChar = "1" OrElse e.KeyChar = _
"2" OrElse e.KeyChar = "3" OrElse e.KeyChar = "4" OrElse e.KeyChar _
= "5" OrElse e.KeyChar = "6" OrElse e.KeyChar = "7" OrElse _
e.KeyChar = "8" OrElse e.KeyChar = "9" OrElse e.KeyChar = "." _
OrElse e.KeyChar = "," OrElse e.KeyChar = "-") Then
e.Handled = True
Exit Sub
End If
'cas du "-"
If e.KeyChar = "-" Then
If My_Compte_Char("-") = 1 Then 'si il y en a deja un on quitte
e.Handled = True
Exit Sub
Else
If Not Me.SelectionStart = 0 Then 'si il n'est pas en première place pareil
e.Handled = True
Exit Sub
End If
End If
End If
'cas du "." et ","
If e.KeyChar = "." OrElse e.KeyChar = "," Then
If My_NB_decimal = 0 Then 'si il n'y a pas de decimal on quitte
e.Handled = True
Exit Sub
End If
If My_Compte_Char(My_separateur_decimal) = 0 Then 'si il n'y a pas deja une virgule on laisse
e.KeyChar = My_separateur_decimal()
Exit Sub
Else
e.Handled = True 'autrement on quitte
Exit Sub
End If
End If
'gestion du nombre de decimal
'si c'est un nombre
If e.KeyChar = "0" OrElse e.KeyChar = "1" OrElse e.KeyChar = _
"2" OrElse e.KeyChar = "3" OrElse e.KeyChar = "4" OrElse e.KeyChar _
= "5" OrElse e.KeyChar = "6" OrElse e.KeyChar = "7" OrElse _
e.KeyChar = "8" OrElse e.KeyChar = "9" Then
'si il n'y a pas de decimal ca sert à rien de compter
If My_NB_decimal = 0 Then
Exit Sub
End If
'si il n'y a pas de virgule pareil
If My_Compte_Char(My_separateur_decimal) = 0 Then
Exit Sub
End If
Dim vir As Integer = InStr(Me.Text, My_separateur_decimal) 'place de la virgule
If vir > Me.SelectionStart Then 'si la virgule se trouve après l'endroit sélectionné
Exit Sub
Else 'autrement on empêche la saisie et on quitte
If My_NB_partie(Me.Text, Partie.Décimal).Length >= My_NB_decimal Then
e.Handled = True
Exit Sub
End If
End If
End If
End Sub
Private Sub Textbox_num_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Validating
Try
If Me.Text = "" Then Exit Sub 'si il n'y a rien on quitte
Dim Text_Format As String = "#, ##0" 'format de depart
If Not My_NB_decimal = 0 Then 'si il y a des decimal
If My_Affiche_0_Inutile = True Then 'on affiche les 0 inutile
Dim i As Integer 'pour la boucle
Text_Format &= "."
For i = 1 To _My_NB_Decimal
Text_Format &= "0" 'on ajoute le nombre de 0 qu'il faut pour le format
Next
Else
Text_Format = "#, ##0.#"
End If
End If
If My_Symbole_Place = Place.Apres Then
Text_Format &= My_Symbole 'on ajoute le symbole après
Else
Text_Format = My_Symbole & Text_Format 'on ajoute le symbole avant
End If
Me.Text = Format(CDec(Me.Text), Text_Format) 'on met au format
Me.Text = Trim(Me.Text) 'on enlève les espaces occasionnel
Catch
#If DEBUG Then
MsgBox(Err.Number & vbNewLine & Err.Description)
#End If
End Try
End Sub
#End Region
End Class
Conclusion :
comme d'habitude, n'hésitez pas à laisser des commentaire ou des idées d'amélioration.
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.