(Visual Studio 2008) Intercepter la touche ECHAP dans une DataGridView

scn68100 Messages postés 153 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 décembre 2019 - 22 juin 2013 à 10:19
scn68100 Messages postés 153 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 décembre 2019 - 23 juin 2013 à 07:47
Bonjour,
Dans une DataGridView, a la saisie d'une quantité, je calcul et affiche le montant
Grace à FOLIV57, j'utilise le code suivant
Private Sub DataGridView1_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        Dim grid As DataGridView = CType(sender, DataGridView)
        If TypeOf grid.EditingControl Is DataGridViewTextBoxEditingControl Then
            Dim cnt As DataGridViewTextBoxEditingControl = CType(grid.EditingControl, DataGridViewTextBoxEditingControl)
            RemoveHandler cnt.KeyDown, AddressOf EditControlKeyPress
            AddHandler cnt.KeyDown, AddressOf EditControlKeyPress
        End If
End Sub

Private Sub EditControlKeyPress(ByVal sender As Object, ByVal e As KeyEventArgs)
        If (e.KeyCode = Keys.Delete) Then
            MessageBox.Show("SUPPR")
        End If
End Sub

Dans la procédure EditControlKeyPress, j'intercepte la touche SUPP, BACKSPACE, ECHAP, et la valeur du caractère saisie
Je m'explique :
L'utilisateur entre dans la cellule à saisir
S'il frappe ECHAP, je traite par la procédure, pas de calcul ni affichage
S'il entre 1, je traite par la procédure (Calcul et affichage)
IL supprime le 1, par SUP ou <- , je traite par la procédure (Calcul et affichage)
L'utilisateur entre 1. Je traite (Calcul et affichage). Il utilise ECHAP, le 1 disparait, mais je n'intercepte pas cette frappe d'ECHAP !
Aussi le pas de calcul, et l'affichage est faux !

J'intercepte la touche ECHAP si elle est frappée seule, mais PAS si elle est frappée après la saisie d'un caractère !!!,

Comment faire ?
SC

2 réponses

Utilisateur anonyme
22 juin 2013 à 21:01
Bonjour,

Il utilise ECHAP, le 1 disparait, mais je n'intercepte pas cette frappe d'ECHAP !
J'intercepte la touche ECHAP si elle est frappée seule, mais PAS si elle est frappée après la saisie d'un caractère !!!,


Donc, le 1 est disparu par l'action du St-Esprit et pas à cause de la touche Échap. Difficile à croire.

Commence donc par mettre un espion sur la valeur d'une cellule et teste cette cellule-là en vérifiant la valeur de l'espion et compare-là à la valeur affichée.
0
scn68100 Messages postés 153 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 décembre 2019
23 juin 2013 à 07:47
Bonjour,
Hum, vous ne connaissez pas mon PC ?
Il est très susceptible, et si je l'insulte, ou pire si je lui donne un coup de pieds, il se met à faire des erreurs !
Je suis obligé de le menacer de le débrancher pour qu'il se remette à fonctionner normalement. Et encore, pas toujours ?

Pour maitriser le problème, j'ai fait un écran tout simple
Une datagridview de 4 colonnes, JOUET, QTE, PRIX, MONTANT, avec la colonne QTE en saisie, et EDITMODE = EDITONENTER
Quand je saisie une QTE, j'affiche le montant.
Si on efface la QTE, j'efface le montant
Voici le code
Public Class Form1
    Dim wNombre As Integer = 0
    Dim cnt As DataGridViewTextBoxEditingControl : Dim grid As DataGridView

    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        With Me.dgvRepasPetDej.Rows
            .Clear()
        End With
        With Me.dgvRepasPetDej.Rows
            .Add("Jouet Fille", _
                "", _
                18.9, _
                "")
            .Add("Jouet Garçon", _
                "", _
                12.34, _
                "")
        End With
        Me.dgvRepasPetDej.Rows(0).Cells(1).Style.BackColor Color.AliceBlue : Me.dgvRepasPetDej.Rows(1).Cells(1).Style.BackColor Color.AliceBlue
        dgvRepasPetDej.Select()
        dgvRepasPetDej.Rows(0).Cells(1).Selected = True
        dgvRepasPetDej.BeginEdit(True)
        dgvRepasPetDej.ClearSelection()
    End Sub

    Private Sub dgvRepasPetDej_CellEndEdit (ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvRepasPetDej.CellEndEdit
        rowIndex = dgvRepasPetDej.CurrentCell.RowIndex
        colIndex = dgvRepasPetDej.CurrentCell.ColumnIndex
        'MessageBox.Show("CellStateChanged - rowIndex " & rowIndex & "  colIndex " & colIndex)
        If colIndex <> 1 Then Exit Sub
        If dgvRepasPetDej.Item(1, rowIndex).Value = Nothing Then
            dgvRepasPetDej.Item(1, rowIndex).Value "" : dgvRepasPetDej.Item(3, rowIndex).Value ""
        End If
    End Sub

    Private Sub dgvRepasPetDej_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvRepasPetDej.EditingControlShowing
        grid = CType(sender, DataGridView)
        cnt = CType(grid.EditingControl, DataGridViewTextBoxEditingControl)
        If TypeOf grid.EditingControl Is DataGridViewTextBoxEditingControl Then
            RemoveHandler cnt.KeyDown, AddressOf EditControlKeyPress
            AddHandler cnt.KeyDown, AddressOf EditControlKeyPress
        Else
            RemoveHandler cnt.KeyDown, AddressOf EditControlKeyPress
        End If
    End Sub
    Private Sub EditControlKeyPress(ByVal sender As Object, ByVal e As KeyEventArgs)
        'MessageBox.Show("EditControlKeyPress - e.KeyCode = " & e.KeyCode)
        Dim wPrix As Decimal 0 : Dim wMontant As Decimal 0
        If (e.KeyCode Keys.Delete) Or (e.KeyCode Keys.Escape) Or (e.KeyCode = Keys.Back) Then
            If dgvRepasPetDej.Rows.Count < 1 Then Exit Sub
            rowIndex = dgvRepasPetDej.CurrentCell.RowIndex
            colIndex = dgvRepasPetDej.CurrentCell.ColumnIndex
            If colIndex <> 1 Then Exit Sub
            dgvRepasPetDej.Item(1, rowIndex).Value = 0
            wNombre = 0
            dgvRepasPetDej.Item(1, rowIndex).Value "" : dgvRepasPetDej.Item(3, rowIndex).Value ""
        Else
            If (e.KeyCode > 47) And (e.KeyCode < 58) Or _
               (e.KeyCode > 95) And (e.KeyCode < 106) Then
                If dgvRepasPetDej.Rows.Count < 1 Then Exit Sub
                rowIndex = dgvRepasPetDej.CurrentCell.RowIndex
                colIndex = dgvRepasPetDej.CurrentCell.ColumnIndex
                If colIndex <> 1 Then Exit Sub
                wNombre = CovertKeyCode(e.KeyCode)
                wPrix = dgvRepasPetDej.Item(2, rowIndex).Value
                wMontant = wNombre * wPrix
                dgvRepasPetDej.Item(3, rowIndex).Value = Format(wMontant, "0.00")
            Else
                Beep() : Beep()
                MessageBox.Show("e.KeyCode = " & e.KeyCode)
                e.Handled = True
                Exit Sub
            End If
        End If
    End Sub

End Class

ECHAP n'est pas intercepté.
Pour contourner ce problème, j'ai ajouté l'événement "CellEndEdit"
Là, si la cellule QTE est nulle, je remets le montant à zéro

Avez-vous une meilleure solution ?
SC
0
Rejoignez-nous