(Visual Studio 2008) Intercepter la touche ECHAP dans une DataGridView
scn68100
Messages postés153Date d'inscriptiondimanche 27 août 2006StatutMembreDernière intervention26 décembre 2019
-
22 juin 2013 à 10:19
scn68100
Messages postés153Date d'inscriptiondimanche 27 août 2006StatutMembreDernière intervention26 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
A voir également:
(Visual Studio 2008) Intercepter la touche ECHAP dans une DataGridView
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.
scn68100
Messages postés153Date d'inscriptiondimanche 27 août 2006StatutMembreDernière intervention26 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