IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Saisie numérique uniquement dans certaines colonnes Datagridview [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2011
    Messages : 141
    Points : 60
    Points
    60
    Par défaut Saisie numérique uniquement dans certaines colonnes Datagridview
    Bonjour à vous

    J'essaye tant bien que mal d'amélioré mon DataGridview et cette fois ci je souhaiterai n'autoriser que la saisie de chiffre avec virgule ou point dans certaine colonne de mes DataGridView.

    Pour mes textbox dans ma form j'utilisai ceci avec l'événement Keypress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
     
            If e.KeyChar = Chr(8) Then
            Else
     
            End If
            If Not Char.IsControl(e.KeyChar) AndAlso Not IsNumeric(e.KeyChar) AndAlso e.KeyChar <> "."c Then
                e.Handled = True
                MessageBox.Show("Valeur numérique uniquement !")
            End If
     
        End Sub

    Si je souhaites avoir la même chose pour ma colonne "Quantité" cela est-il réalisable dans des colonnes de DataGridView ??

    Merci beaucoup

  2. #2
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    Points : 40
    Points
    40
    Par défaut
    Salut,
    je pense que cela doit être possible si tu regardes du côté de l'evènement DataError de ton datagridview

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Points : 206
    Points
    206
    Par défaut
    A l'apparition de l'évènement _EditingControlShowing, on récupère le contrôle (un TextBox) contenu dans la cellule.

    On transfère la gestion de l'évènement _KeyPress de ce contrôle vers une procédure perso (ici 2 procédures de traitement des nombres, décimaux ou entiers).

    Les procédures sont assez sommaires (désolé de ne pas m'être plus investi). Néanmoins elles filtrent les chiffres (c'est bien le moins) et, pour celle des nombres décimaux, elle convertit le "." ou la "," dans le séparateur contextuel (la "," chez nous). Une seule virgule est acceptée.
    On pourrait peaufiner le bidule en modifiant à la volée l'apparence des nombres (exemple ajouter automatiquement un zéro devant une virgule seule, réduire les nombres du type 02 en 2, etc.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
        Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
            'Obtenir le composant
            Dim grid As DataGridView = DirectCast(sender, DataGridView)
            'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
            Dim colonneQuantite As String = "ColonneQuantite"
            Dim colonnePrixUnit As String = "ColonnePrixUnit"
            Dim colonneTotal As String = "ColonneTotal"
            'Traitement en fonction de la colonne où se situe la cellule en cours d'édition 
            Dim indexColonne As Integer = grid.CurrentCell.ColumnIndex
            Select Case grid.Columns(indexColonne).Name
                Case colonnePrixUnit
                    'Récupération du contrôle contenu (Textbox)
                    Dim txtDecimal As TextBox = DirectCast(e.Control, TextBox)
                    'Envoi vers la routine de traitement d'un nombre décimal
                    AddHandler txtDecimal.KeyPress, AddressOf txtDecimal_KeyPress
                Case colonneQuantite
                    'Récupération du contrôle contenu (Textbox)
                    Dim txtEntier As TextBox = DirectCast(e.Control, TextBox)
                    'Envoi vers la routine de traitement d'un nom entier
                    AddHandler txtEntier.KeyPress, AddressOf txtEntier_KeyPress
            End Select
        End Sub
     
        Private Sub txtDecimal_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
            Dim txtDecimal As TextBox = DirectCast(sender, TextBox)
            Dim separateur As String = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
            If "0123456789".Contains(e.KeyChar) = True Then
                'Les chiffres sont acceptés
                Exit Sub
            ElseIf ",.".Contains(e.KeyChar) = True Then
                'Traitement de la virgule (, ou .)
                If txtDecimal.Text.Contains(separateur) = False Then
                    'On modifie la touche en séparateur décimal courant
                    e.KeyChar = separateur
                Else
                    'Il y a déjà une virgule, on "lève" l'évènement
                    e.Handled = True
                End If
            ElseIf e.KeyChar <> Convert.ToChar(Keys.Back) Then
                'On accepte le retour arrière. Le reste des touches est inhibé (e.handled=true)
                e.Handled = True
            End If
        End Sub
     
        Private Sub txtEntier_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
            If "0123456789".Contains(e.KeyChar) = True Then
                'Les chiffres sont acceptés
                Exit Sub
            ElseIf e.KeyChar <> Convert.ToChar(Keys.Back) Then
                'On accepte le retour arrière. Le reste des touches est inhibé (e.handled=true)
                e.Handled = True
            End If
        End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2011
    Messages : 141
    Points : 60
    Points
    60
    Par défaut
    Problème encore une fois résolu un GROS merci

    J'éspère un jour avoir ton niveau mdevaux62

  5. #5
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2011
    Messages : 141
    Points : 60
    Points
    60
    Par défaut
    mdevaux62, je reviens auprès de toi car je m’aperçois que dans mes 3 colonnes je n'ai plus la possibilité d'utilisé le "." ou "," c'est donc assez embêtant étant donné que je pouvais l'utiliser auparavant.

    En suivant l'exemple que tu m'a proposer,

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
            Dim voControl As DataGridViewTextBoxEditingControl
            Try
                If DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Name = "DataGridViewTextBoxColumnEpmm" Then
                    voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
     
                    AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                End If
     
            Catch ex As Exception
     
            End Try
     
            'Obtenir le composant
            Dim grid As DataGridView = DirectCast(sender, DataGridView)
            'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
            Dim colonneQuantite As String = "QuantitéDataGridViewTextBoxColumn"
            Dim colonnePrixUnit As String = "PrixUDataGridViewTextBoxColumn"
            Dim colonneTotal As String = "TotalDataGridViewTextBoxColumn"
            'Traitement en fonction de la colonne où se situe la cellule en cours d'édition 
            Dim indexColonne As Integer = grid.CurrentCell.ColumnIndex
            Select Case grid.Columns(indexColonne).Name
                Case colonnePrixUnit
                    'Récupération du contrôle contenu (Textbox)
                    Dim txtDecimal As TextBox = DirectCast(e.Control, TextBox)
                    'Envoi vers la routine de traitement d'un nombre décimal
                    AddHandler txtDecimal.KeyPress, AddressOf txtDecimal_KeyPress
                Case colonneQuantite
                    'Récupération du contrôle contenu (Textbox)
                    Dim txtEntier As TextBox = DirectCast(e.Control, TextBox)
                    'Envoi vers la routine de traitement d'un nom entier
                    AddHandler txtEntier.KeyPress, AddressOf txtEntier_KeyPress
            End Select
        End Sub
     
        Private Sub txtDecimal_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
            Dim txtDecimal As TextBox = DirectCast(sender, TextBox)
            Dim separateur As String = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
            If "0123456789".Contains(e.KeyChar) = True Then
                'Les chiffres sont acceptés
                Exit Sub
            ElseIf ",.".Contains(e.KeyChar) = True Then
                'Traitement de la virgule (, ou .)
                If txtDecimal.Text.Contains(separateur) = False Then
                    'On modifie la touche en séparateur décimal courant
                    e.KeyChar = separateur
                Else
                    'Il y a déjà une virgule, on "lève" l'évènement
                    e.Handled = False
                End If
            ElseIf e.KeyChar <> Convert.ToChar(Keys.Back) Then
                'On accepte le retour arrière. Le reste des touches est inhibé (e.handled=true)
                e.Handled = True
            End If
        End Sub
     
        Private Sub txtEntier_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
            If "0123456789".Contains(e.KeyChar) = True Then
                'Les chiffres sont acceptés
                Exit Sub
            ElseIf e.KeyChar <> Convert.ToChar(Keys.Back) Then
                'On accepte le retour arrière. Le reste des touches est inhibé (e.handled=true)
                e.Handled = True
            End If
        End Sub

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Points : 206
    Points
    206
    Par défaut
    As-tu essayé de supprimer (mettre en commentaire) la portion de code ajoutée en début de procédure ?
    Celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            Dim voControl As DataGridViewTextBoxEditingControl
            Try
                If DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Name = "DataGridViewTextBoxColumnEpmm" Then
                    voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
     
                    AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                End If
     
            Catch ex As Exception
     
            End Try
    D'autre part je ne pige pas trop l'utilité du Try Catch à cet endroit (???)

    Je n'ai pas cherché à comprendre ce que tu veux faire, mais, si tu veux traiter les caractères entrés dans d'autres colonnes, il te suffit d'ajouter un nouveau Case à l'intérieur du Select Case (figurant en ligne 22 dans ton exemple).

  7. #7
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2011
    Messages : 141
    Points : 60
    Points
    60
    Par défaut
    Oui oui j'avais essayé d'enlever cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim voControl As DataGridViewTextBoxEditingControl
            Try
                If DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Name = "DataGridViewTextBoxColumnEpmm" Then
                    voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
     
                    AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                End If
     
            Catch ex As Exception
     
            End Try
    mais rien n'y change les virgules et les point ne sont pas pris en compte par le clavier je ne comprend pas pourquoi

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Points : 206
    Points
    206
    Par défaut
    OK j'ai la même erreur chez moi.
    Il doit y avoir une confusion entre les 2 AddHandler.

    Donc :
    1) On simplifie la routine de captage
    2) Et on place tout le code dans une seule procédure qui gèrera TOUS les formats (ici décimal et entier).

    La procédure gérant l'évènement _EditingControlShowing est simmplifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
            Dim txtEdition As TextBox = DirectCast(e.Control, TextBox)
            AddHandler txtEdition.KeyPress, AddressOf txtEdition_KeyPress
        End Sub
    On supprime les 2 procédures txtDecimal_KeyPress et txtEntier_KeyPress.

    On les remplace par une seule et unique procédure txtEdition_KeyPress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
        Private Sub txtEdition_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
            'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
            Dim colonneQuantite As String = "ColonneQuantite"
            Dim colonnePrixUnit As String = "ColonnePrixUnit"
            Dim colonneTotal As String = "ColonneTotal"
            Dim cellule As DataGridViewCell = DataGridView1.CurrentCell
            Select Case DataGridView1.Columns(cellule.ColumnIndex).Name
                Case colonnePrixUnit
                    'Nombre décimal
                    Dim txtDecimal As TextBox = DirectCast(sender, TextBox)
                    Dim separateur As String = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
                    If "0123456789".Contains(e.KeyChar) = True Then
                        'Les chiffres sont acceptés
                        Exit Sub
                    ElseIf ",.".Contains(e.KeyChar) = True Then
                        'Traitement de la virgule (, ou .)
                        If txtDecimal.Text.Contains(separateur) = False Then
                            'On modifie la touche en séparateur décimal courant
                            e.KeyChar = separateur
                            Exit Sub
                        Else
                            'Il y a déjà une virgule, on "lève" l'évènement
                            e.Handled = True
                        End If
                    ElseIf e.KeyChar <> Convert.ToChar(Keys.Back) Then
                        'On accepte le retour arrière. Le reste des touches est inhibé (e.handled=true)
                        e.Handled = True
                    End If
                Case colonneQuantite
                    'Nombre entier
                    If "0123456789".Contains(e.KeyChar) = True Then
                        'Les chiffres sont acceptés
                        Exit Sub
                    ElseIf e.KeyChar <> Convert.ToChar(Keys.Back) Then
                        'On accepte le retour arrière. Le reste des touches est inhibé (e.handled=true)
                        e.Handled = True
                    End If
            End Select
        End Sub
    Si tu dois gérer un autre format (référence produit ou libellé par exemple), tu ajoutes un nouveau Case NomDeTaColonne dans le Select Case et tu traites à l'intérieur les caractères qui sont acceptés ou non.

  9. #9
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2011
    Messages : 141
    Points : 60
    Points
    60
    Par défaut
    Tout fonctionne à merveille et je t'en remercie énormément.

    Pour ma colonne "quantité" je souhaites aussi garder des nombres décimaux ducoup j'ai repris ton exemple avec "Case" et tout fonctionne



    Merciiiiii

  10. #10
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Formidable, j'ai +1, ça marche nickel.

    J'ai tout de même un petit truc à ajouter, il se trouve que j'ai des colonnes quine sont pas des DataGridViewTextBoxColumn, du coup ça levait une exception. Un petit test à fais l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
     
          If e.Control.GetType Is GetType(DataGridViewTextBoxColumn) Then
     
                  Dim txtEdition As TextBox = DirectCast(e.Control, TextBox)
                  AddHandler txtEdition.KeyPress, AddressOf txtEdition_KeyPress
     
          End If
     
    End Sub
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/02/2011, 17h36
  2. [XL-2010] Generer un ID unique dans une colonne
    Par Tonton_glenn dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/09/2010, 12h30
  3. Valeur unique dans la colonne
    Par FranT dans le forum Composants
    Réponses: 4
    Dernier message: 28/01/2010, 18h01
  4. Remplir certaines colonnes datagridview via requete
    Par jpbelmondo59 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/09/2009, 18h45
  5. Réponses: 4
    Dernier message: 13/07/2007, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo