Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
26 septembre 2007 3 26 /09 /septembre /2007 10:30

Le séparateur numérique n'étant pas le même en france que dans les pays anglosaxons, il est nécessaire de filter la saisie des chiffres décimaux afin de transformer les "." (point) en "," (virgule).

Pour cet exemple, nous allons utiliser un DataGridView que l'on appellera dgvTarifs et dont nous allons gérer l'événement EditingControlShowing. Nous ne filtrerons la saisie que sur 2 colonnnes : coefTarif et prixVenteHT

 

Code :

Private Sub dgvTarifs_EditingControlShowing(ByVal sender As Object, ByVal e As  System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvTarifs.EditingControlShowing

        ' on récupère le control TextBox de la cellule qui est édité       

        Dim voControl As DataGridViewTextBoxEditingControl = Nothing voControl = CType(e.Control, DataGridViewTextBoxEditingControl)

                    Select Case Me.dgvTarifs.Columns(dgvTarifs.CurrentCell.ColumnIndex).Name
               ' si la colonne qui est éditée est coefTarif ou prixVenteHT alors on gère l'événement KeyPress du TextBox            

               Case "coefTarif", "prixVenteHT"

                   RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress

                   AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                Case Else
                    RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
            End Select
  End Sub

    Private Sub EditingControl_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)

       ' on accepte que les caractères numériques, le point, ou la virgule       

       e.Handled = Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or e.KeyChar = "." Or e.KeyChar = ",")

       ' on récupère le texte du TextBox

        Dim txt As String = CType(sender, DataGridViewTextBoxEditingControl).Text

        ' on s'assure que le point ou la virgule n'a été tapé qu'une fois

        If (InStr(txt, ".") > 0 Or InStr(txt, ",") > 0) And (e.KeyChar = "." Or e.KeyChar = ",") Then
            e.KeyChar = Nothing
        Else
           ' on remplace le point par une virgule ou la virgule par un point en fonction du séparateur décimal utilisé dans la culture en cours

            Dim vsDecimalSeparator As Char
            vsDecimalSeparator = CChar(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator)

            If vsDecimalSeparator <> "." And e.KeyChar = "." Then
                e.KeyChar = vsDecimalSeparator
            End If
        End If

    End Sub

Partager cet article
Repost0

commentaires

M
Bonjour !<br /> <br /> Je déterre cette vieille solution mais qui m'a bcp aidée moi aussi ! Une petite question toutefois : si j'ai une colonne qui n'est pas de type texte dans mon datagridview, j'ai un message d'erreur quand je vais vouloir modifier une cellule de cette colonne (liste de choix). Comment faire pour qu'il ne traite pas cette colonne svp ? <br /> <br /> Merci !<br /> <br /> Marie
Répondre
G
Thanks for sharing the code for filtering enter numbers with decimal point in a cell! I tried this and it worked well without showing any errors! You should be very careful while copying the code, since a small mismatch may lead the program malfunction!
Répondre
G
<br /> Un grand merci, du tres bon travail 10/10<br /> <br /> <br />
Répondre
N
<br /> Je tiens à te féliciter pour ce merveilleux code qui m'a débloqué dans la création d'un petit soft.<br /> Merci encore et bonne continuation à toi<br /> <br /> <br />
Répondre
C
<br /> <br /> Très heureux que cela ait pu t'aider. Merci pour tes encouragements. <br /> <br /> <br /> <br />
P
J'ai passé je ne sais combien de temps pour trouver comment faire ça.<br /> Super code !!!<br /> Merci
Répondre
C
J'ai moi même mis du temps à trouver une solution convenable à ce problème. Heureux de voir que mon code a fait ton bonheur ;)