Comment remplacer la touche d'entrée dans un tableau de données pour que le focus soit placé sur la colonne suivante au lieu de la ligne suivante ?
Réponses
Trop de publicités?Tout ce que vous avez à faire est de gérer l'événement KeyDown du DataGridView et, dans le gestionnaire, de vérifier si la touche actuellement enfoncée est une touche Entrée. Si c'est le cas, il suffit de définir le CurrentCell du DataGridView sur la cellule suivante (vérifiez également s'il s'agit de la dernière cellule de la rangée, dans ce cas, déplacez-vous sur la première cellule de la rangée suivante).
Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles DataGridView1.KeyDown
If e.KeyCode = Keys.Enter Then
Dim numCols As Integer = DataGridView1.ColumnCount
Dim numRows As Integer = DataGridView1.RowCount
Dim currCell As DataGridViewCell = DataGridView1.CurrentCell
If currCell.ColumnIndex = numCols - 1 Then
If currCell.RowIndex < numRows - 1 Then
DataGridView1.CurrentCell = DataGridView1.Item(0, currCell.RowIndex + 1)
End If
Else
DataGridView1.CurrentCell = DataGridView1.Item(currCell.ColumnIndex + 1, currCell.RowIndex)
End If
e.Handled = True
End If
End Sub
J'ai trouvé l'aide dont j'avais besoin pour me remettre sur pied en ce lien notamment dans le retour d'expérience de Rong-Chun Zhang sur le sous-classement DataGridView
pour passer outre ProcessDialogKey
. J'ai transformé son travail pour répondre à mes propres besoins dans l'exemple ci-dessous.
Objectif : A proprement parler, il s'agissait d'empêcher le focus de la grille de passer de la dernière cellule à la fin de la dernière ligne à la ligne suivante lorsque la touche ENTER est pressée, uniquement dans les cas où le focus quitte une cellule de l'avant-dernière ligne.
Le contexte : J'avais activé l'option Grille pour permettre aux utilisateurs de créer de nouvelles lignes dans la base de données, donc pour leur simplifier la tâche, le comportement par défaut de la Grille est qu'une nouvelle ligne vide est toujours ajoutée en bas, et dès que l'utilisateur s'y déplace, même par inadvertance, une nouvelle ligne vide est créée dans la base de données. Les utilisateurs appuient généralement sur ENTRÉE après avoir terminé les modifications dans une cellule, il n'y avait donc pas de bon moyen pour l'utilisateur de terminer sa modification dans la dernière cellule du bas sans créer une nouvelle ligne vide.
Notez que dans ce cas, je laisse la cellule courante où elle se trouve, mais elle peut être réaffectée avant l'appel à 'return true'.
public class DataGridViewAddRow : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
//cell is in Edit mode
if (keyData == Keys.Enter)
{
if (this.CurrentCell.RowIndex == this.Rows.Count-2)
{
return true;
}
}
return base.ProcessDialogKey(keyData);
}
}
Le focus du DataGridView sur la cellule ou la colonne suivante lorsque la touche Entrée est pressée pour VB.net :
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridViewX1.CellEndEdit
Si DataGridView1.CurrentCell.ColumnIndex = DataGridView1.ColumnCount - 1 Alors DataGridView1.CurrentCell = DataGridView1.Item(0, DataGridView1.CurrentCell.RowIndex + 1) Else SendKeys.Send("{up}") SendKeys.Send("{droite}") End If
End Sub
Private Sub DbGDetail_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DbGDetail.KeyDown
If e.KeyCode = Keys.Enter Then
SendKeys.Send("{Tab}")
e.Handled = True
End If
End Sub
Private Sub DbGDetail_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DbGDetail.CellEndEdit
SendKeys.Send("{up}")
SendKeys.Send("{Tab}")
End Sub