none
Récupérer la valeur saisie dans une DataGridView (Résolu) RRS feed

  • Question

  • Bonjour,

    J'ai une DataGridView avec 4 colonnes :

    Article, Qte, Prix, Montant

    Qte, Prix, Montant doivent être de type décimal

    Seul Qte est modifiable

    J'affiche la DataGridView

    Ensuite, quand je saisie une Qte, SANS SORTIR de la cellule, je veux afficher le Montant

     

    Tous les événements que j'ai essayés ne le permettre QUE LORS de la sortie de la cellule

     

    Avez-vous une solution ? Merci

    Au passage, comment mettre le focus dans une cellule ?

    Cordialement

    SC

    Public Class Form1
        Dim wQte, wPrix, wMontant As Decimal
        Dim KeyAscii As Short
        Dim wRow, wCol As Integer
        Dim wDebut As Boolean = True
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            wQte = 0 : wPrix = 0 : wMontant = 0
            With Me.dgvSaisie.Rows
                .Clear()
            End With
            With Me.dgvSaisie.Rows
                .Add("Jouet Fille", _
                    "", _
                    18.9, _
                    "")
                .Add("Jouet Garçon", _
                    "", _
                    12.34, _
                    "")
            End With
    
            '   Comment mettre le focus ?
            Me.dgvSaisie.Select()
            dgvSaisie.CurrentCell = dgvSaisie.Rows(0).Cells(1)
            dgvSaisie.Rows(0).Cells(1).Selected = True
            Me.dgvSaisie.Focus()
    
            wDebut = False
        End Sub
    
          
        Private Sub dgvSaisie_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvSaisie.EditingControlShowing
            ' on récupère le control TextBox de la cellule qui est édité    
    
            wRow = dgvSaisie.CurrentCell.RowIndex
            wCol = dgvSaisie.CurrentCell.ColumnIndex
    
            Dim voControl As DataGridViewTextBoxEditingControl = Nothing
            voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
            Select Case Me.dgvSaisie.Columns(dgvSaisie.CurrentCell.ColumnIndex).Name
                ' si la colonne qui est éditée est NetDeclarer alors on gère l'événement KeyPress du TextBox            
                Case "Qte"
                    RemoveHandler voControl.KeyPress, AddressOf dgvSaisieEditingControl_KeyPress
                    AddHandler voControl.KeyPress, AddressOf dgvSaisieEditingControl_KeyPress
                    If Me.dgvSaisie.Item(1, wRow).Value <> "" Then Me.dgvSaisie.Item(3, wRow).Value = Me.dgvSaisie.Item(1, wRow).Value * Me.dgvSaisie.Item(2, wRow).Value
                Case Else
                    RemoveHandler voControl.KeyPress, AddressOf dgvSaisieEditingControl_KeyPress
            End Select
        End Sub
    
        Private Sub dgvSaisieEditingControl_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
            KeyAscii = Asc(e.KeyChar)
            If (KeyAscii < 48 Or KeyAscii > 57) And (KeyAscii <> 46) Then
                If (KeyAscii <> 8) Then
                    Beep()
                    KeyAscii = 0
                End If
            End If
            e.KeyChar = Chr(KeyAscii)
            If KeyAscii = 0 Then
                Beep()
                e.Handled = True
            End If
        End Sub
    End Class


    Cordialement SC


    • Modifié AOC_SCN samedi 14 septembre 2019 04:34 Résolu
    vendredi 23 août 2019 09:38

Réponses

  • Bonjour AOC_SCN,

    Comment lier l'événement KeyUp à ces codes ?

    De la même façon que vous avez testé la méthode avec l’événement KeyPress : dans l’événement EditingControlShowing du DataGridView (pourvu que le nom de la deuxième colonne est Qte) vous ajoutez le gestionnaire (AddHandler) respectif (KeyUp au lieu de KeyPress). Ne vous abonnez pas à l’événement KeyUp du DataGridView.

            voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
            Select Case Me.dgvSaisie.Columns(dgvSaisie.CurrentCell.ColumnIndex).Name
                ' si la colonne qui est éditée est NetDeclarer alors on gère l’événement KeyUp du TextBox
                Case "Qte"
                    RemoveHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
                    AddHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
                Case Else
                    RemoveHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
            End Select

    Je n'ai pas compris :

    "Dans ce but, utilisez l’événement KeyUp au lieu de KeyPress et la propriété Text du paramètre sender

    La propriété Text du paremètre sender contient le caractère qui vient d’être entré ("3" dans la capture d’écran). Si le contenu de la cellule n’est pas un chiffre valide, la méthode Decimal.TryParse retournera False et la cellule de la quatrième colonne (Montant) ne sera pas modifiée. Voici une capture d’écran pour "3,5" :

    Je vous remercie par avance de votre retour.

    Cordialement,
    Dimitar

    P. S. J’ai juste remarqué que je n’avais pas adapté un des commentaires au nouvel événement -> (' si la colonne qui est éditée est NetDeclarer alors on gère l'événement KeyPress du TextBox  -> ' si la colonne qui est éditée est NetDeclarer alors on gère l'événement KeyUp du TextBox ) et je viens de le corriger.

    vendredi 13 septembre 2019 09:53

Toutes les réponses

  • Bonjour SC,

    Dans ce but, utilisez l’événement KeyUp au lieu de KeyPress et la propriété Text du paramètre sender (une fois ce pramètre converti en DataGridViewTextBoxEditingControl). Je vous propose de tester le code suivant :

         Private Sub dgvSaisie_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs)
            ' on récupère le control TextBox de la cellule qui est édité    
    
            wRow = dgvSaisie.CurrentCell.RowIndex
            wCol = dgvSaisie.CurrentCell.ColumnIndex
    
            Dim voControl As DataGridViewTextBoxEditingControl = Nothing
            voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
            Select Case Me.dgvSaisie.Columns(dgvSaisie.CurrentCell.ColumnIndex).Name
                ' si la colonne qui est éditée est NetDeclarer alors on gère l'événement KeyUp du TextBox            
                Case "Qte"
                    RemoveHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
                    AddHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
                Case Else
                    RemoveHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
            End Select
        End Sub
    
        Private Sub dgvSaisieEditingControl_KeyUp(sender As Object, e As KeyEventArgs)
            Dim ec As DataGridViewTextBoxEditingControl = CType(sender, DataGridViewTextBoxEditingControl)
            Dim resultat As Decimal
            Dim chiffre As Boolean       'le contenu doit être un chiffre (Decimal)
            chiffre = Decimal.TryParse(ec.Text, resultat)
            If chiffre = True Then              'si le contenu de la cellule est bien formaté et convertissable en Decimal
                resultat = resultat * CType(Me.dgvSaisie.Item(2, wRow).Value, Decimal)
                Me.dgvSaisie.Item(3, wRow).Value = resultat
            End If
        End Sub

    Cordialement,
    Dimitar


    jeudi 29 août 2019 11:23
  • Bonjour,

    Désolé pour cette réponse tardive, mais j'ai quelques ennuis de santé en ce moment

    Merci pour l'aide, je vais tester plus tard

    Cordialement

    SC


    Cordialement SC

    vendredi 30 août 2019 07:07
  • Bonjour,

    Merci pour l'aide

    Je n'ai pas compris :

    "Dans ce but, utilisez l’événement KeyUp au lieu de KeyPress et la propriété Text du paramètre sender (une fois ce pramètre converti en DataGridViewTextBoxEditingControl). Je vous propose de tester le code suivant"

    Utilisé seul ces codes ne sont pas interceptés lors de l’exécution

    Comment lier l'événement KeyUp à ces codes ?

    Cordialement

    SC


    Cordialement SC

    vendredi 13 septembre 2019 08:30
  • Bonjour AOC_SCN,

    Comment lier l'événement KeyUp à ces codes ?

    De la même façon que vous avez testé la méthode avec l’événement KeyPress : dans l’événement EditingControlShowing du DataGridView (pourvu que le nom de la deuxième colonne est Qte) vous ajoutez le gestionnaire (AddHandler) respectif (KeyUp au lieu de KeyPress). Ne vous abonnez pas à l’événement KeyUp du DataGridView.

            voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
            Select Case Me.dgvSaisie.Columns(dgvSaisie.CurrentCell.ColumnIndex).Name
                ' si la colonne qui est éditée est NetDeclarer alors on gère l’événement KeyUp du TextBox
                Case "Qte"
                    RemoveHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
                    AddHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
                Case Else
                    RemoveHandler voControl.KeyUp, AddressOf dgvSaisieEditingControl_KeyUp
            End Select

    Je n'ai pas compris :

    "Dans ce but, utilisez l’événement KeyUp au lieu de KeyPress et la propriété Text du paramètre sender

    La propriété Text du paremètre sender contient le caractère qui vient d’être entré ("3" dans la capture d’écran). Si le contenu de la cellule n’est pas un chiffre valide, la méthode Decimal.TryParse retournera False et la cellule de la quatrième colonne (Montant) ne sera pas modifiée. Voici une capture d’écran pour "3,5" :

    Je vous remercie par avance de votre retour.

    Cordialement,
    Dimitar

    P. S. J’ai juste remarqué que je n’avais pas adapté un des commentaires au nouvel événement -> (' si la colonne qui est éditée est NetDeclarer alors on gère l'événement KeyPress du TextBox  -> ' si la colonne qui est éditée est NetDeclarer alors on gère l'événement KeyUp du TextBox ) et je viens de le corriger.

    vendredi 13 septembre 2019 09:53
  • Bonjour,

    OK, cela fonctionne

    J'ai juste modifié la SUB

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

    J'ai ajouté

    Handles dgvSaisie.EditingControlShowing

    C'est ce qui me manquait pour faire le lien

    Merci

    SC


    Cordialement SC

    samedi 14 septembre 2019 04:33