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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    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
    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 actif
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    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 expérimenté
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    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 très actif
    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
    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 très actif
    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
    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 expérimenté
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    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).

+ 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