Textbox numérique

Contenu du snippet

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.

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.