0 votes

remplacer la navigation du datagridview par la touche entrée

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 ?

2voto

Cerebrus Points 18045

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

1voto

ken papa Points 11

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);

    }

}

0voto

Widodo Points 1

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

0voto

user1856205 Points 6
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X