Sujet : [Vb.Net][1.1] TextBox : format décimal, pavé numérique et virgule

Bonjour,

Me revoici avec mon ami Vb.Net :siffle:

Je souhaite mettre en place un filtrage sur un textBox pour ne saisir que des valeurs décimales.

Visiblement, on ne peut pas définir un format qui permettrait de faire ça simplement. Donc j'ai codé une 'tite méthode pour faire mon filtrage. Elle fonctionne...à ceci près qu'il reste un problème avec la touche '.' du pavé numérique mad qui est en étroite relation avec les paramètres régionaux de la machine...toujours le même problème.

Le problème est le suivant : impossible d'obtenir la virgule depuis le pavé numérique (j'ai vérifié, je suis bien en format ',' pour le séparateur décimal sur ma machine).

Pour voir, j'ai fait un test : nouveau projet, nouvelle fenêtre, un unique textBox dans la fenêtre, compilation, [s]bourrinnage[/s] essai dans le champ de la touche point du pavé numérique : résultat, le '.' s'affiche et non la ','. Génial...

Donc si jamais quelqu'un à une solution, je suis preneur big_smile !

Pour info, voici ma gestion de filtrage :

Private Const K_FILTRE_DOUBLE As String = "1234567890,"


' L'événement exécuter sur les frappes claviers dans mon champ
Private Sub txtDimLong_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtDimLong.KeyPress
    filtrerFrappe(sender, e, K_FILTRE_DOUBLE)
End Sub


'
' Filtre la frappe dans un champ selon les éléments autorisés.
'
' @param    [TextBox]                txtCourant    Champ concerné par le filtrage.
' @param    [KeyPressEventArgs]        e            L'objet qui permet de contrôler la frappe clavier.
' @param    [String]                sFiltre        Chaîne qui contient la liste des caractères autorisés.
' @return    [Boolean]                            True si caractère autorisé, False sinon.
'
Private Sub filtrerFrappe(ByRef txtCourant As TextBox, ByRef e As System.Windows.Forms.KeyPressEventArgs, ByVal sFiltre As String)
    Dim bFiltrer As Boolean = False
    Dim cFrappe As String = e.KeyChar

    ' Vérification que le caractère saisi est autorisé
    bFiltrer = (sFiltre.IndexOf(cFrappe) = -1)

    ' On vérifie que le caractère "," n'a été saisi qu'une seule fois et pas en début de frappe
    If cFrappe = "," Then
        If txtCourant.Text.IndexOf(cFrappe) <> -1 Then
            bFiltrer = True
        Else
            bFiltrer = (txtCourant.Text.Length = 0)
        End If
    End If

    ' Touche backspace autorisée
    If cFrappe = ControlChars.Back Then bFiltrer = False

    ' Autorisation ou interdiction de la frappe
    e.Handled = bFiltrer
End Sub
-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

Re : [Vb.Net][1.1] TextBox : format décimal, pavé numérique et virgule

Je crois que la gestion des paramètres régionaux va te poursuivre encore un petit bout de temps smile

----------------------------------------------------------------------------------------------------------------------------
On peut être intelligent toute sa vie et stupide un instant.

WWW

3 Dernière modification par SamRay1024 (16/06/2006 15h54m07s)

Re : [Vb.Net][1.1] TextBox : format décimal, pavé numérique et virgule

Bon aller, comme je suis un mec sympa big_smile, je vous donne la solution que j'ai finalement trouvée. C'est du bourrinage, mais que voulez-vous, .net reste .net...

Jusque là, mon but était d'interdire la saisie du '.'. Et bien pour finir, j'ai autorisé sa saisie. Oui oui oui. Pour arriver à mes fins, j'ai ajouté un tout petit traitement lors de l'événement qui représente le relachement d'une touche clavier. Ce petit traitement vérifie si un '.' se trouve dans le champ et le remplace alors par une virgule. Cela a nécessité une légère modif dans la fonction de filtrage et c'est tout ! J'ai [s]niqué[/s] contourné [s]Vb[/s] le problème !

Je mets les bouts de codes finaux qui permettent de faire le filtrage correctement ; on ne sait jamais, ca pourra sûrement [s]me reservir[/s] servir à d'autres big_smile !

Private Const K_FILTRE_DOUBLE As String = "1234567890,."


' L'événement exécuté sur les frappes claviers dans mon champ
Private Sub txtDimLong_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtDimLong.KeyPress
    filtrerFrappe(sender, e, K_FILTRE_DOUBLE)
End Sub


' Relâchement de la touche clavier
Private Sub txtDimLong_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtDimLong.KeyUp
    ' On remplace tout "." éventuel qui viendrait malheureusement se glisser dans le champ par une ","
    CType(sender, TextBox).Text = CType(sender, TextBox).Text.Replace(".", ",")

    ' On replace le curseur en fin de saisie, sinon il reste devant la virgule fraichement remplaçée
    CType(sender, TextBox).SelectionStart = CType(sender, TextBox).Text.Length
End Sub


'
' Filtre la frappe dans un champ selon les éléments autorisés.
'
' @param    [TextBox]                txtCourant    Champ concerné par le filtrage.
' @param    [KeyPressEventArgs]        e            L'objet qui permet de contrôler la frappe clavier.
' @param    [String]                sFiltre        Chaîne qui contient la liste des caractères autorisés.
' @return    [Boolean]                            True si caractère autorisé, False sinon.
'
Private Sub filtrerFrappe(ByRef txtCourant As TextBox, ByRef e As System.Windows.Forms.KeyPressEventArgs, ByVal sFiltre As String)
    Dim bFiltrer As Boolean = False
    Dim cFrappe As String = e.KeyChar

    ' L'astuce !
    If cFrappe = "." Then cFrappe = ","

    ' Vérification que le caractère saisi est autorisé
    bFiltrer = (sFiltre.IndexOf(cFrappe) = -1)

    ' On vérifie que le caractère "," n'a été saisi qu'une seule fois et pas en début de frappe
    If cFrappe = "," Then
        If txtCourant.Text.IndexOf(cFrappe) <> -1 Then
            bFiltrer = True
        Else
            bFiltrer = (txtCourant.Text.Length = 0)
        End If
    End If

    ' Touche backspace autorisée
    If cFrappe = ControlChars.Back Then bFiltrer = False

    ' Autorisation ou interdiction de la frappe
    e.Handled = bFiltrer
End Sub

Voilà voila !

Bien évidemment, si quelqu'un à une autre solution, qu'il n'hésite pas à me faire passer pour un débile wink.

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW