DataGridView-lorsque j’appuie sur Entrée, il passe à la cellule suivante

J’ai un datagridview avec 5 colonnes, quand j’appuie sur “enter” il va à la cellule suivante et quand il arrive à la fin des lignes quand j’appuie sur enter il ajoute de nouvelles lignes, mais mon problème est quand je passe au précédent lignes après que j’appuie sur entrer il saute les lignes et ne va pas aux cellules suivantes, aucune aide?

public partial class Form1 : Form { public static int Col; public static int Row; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { dataGridView1.AllowUserToAddRows = false; dataGridView1.Rows.Add(); } private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) { Col = dataGridView1.CurrentCellAddress.X; Row = dataGridView1.CurrentCellAddress.Y; } private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (int)Keys.Enter) { if (Col + 1 < 5) { dataGridView1.CurrentCell = dataGridView1[Col + 1, Row]; } else { dataGridView1.Rows.Add(); dataGridView1.CurrentCell = dataGridView1[Col - 4, Row + 1]; } } } } 

Oubliez également l’événement CellEnter et l’événement Form1_KeyPress. Il suffit de gérer l’événement dataGridView1_KeyDown comme suit :

  private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { int col = dataGridView1.CurrentCell.ColumnIndex; int row = dataGridView1.CurrentCell.RowIndex; if (col < dataGridView1.ColumnCount - 1) { col ++; } else { col = 0; row++; } if (row == dataGridView1.RowCount) dataGridView1.Rows.Add(); dataGridView1.CurrentCell = dataGridView1[col, row]; e.Handled = true; } } 

Veuillez noter que j'ai légèrement modifié le code et que vous devez définir la propriété d'événement Handled sur true, sinon le comportement par défaut sera traité.

À votre santé!

ça marche pour moi

 private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { e.SuppressKeyPress = true; int row = dataGridView1.CurrentRow.Index; int col = dataGridView1.CurrentCell.ColumnIndex; } } 

Essayez d’utiliser ceci:

 bool notlastColumn = true; protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) { int icolumn = dataGridView1.CurrentCell.ColumnIndex; int irow = dataGridView1.CurrentCell.RowIndex; int i = irow; if (keyData == Keys.Enter) { if (icolumn == dataGridView1.Columns.Count - 1) { //dataGridView1.Rows.Add(); if (notlastColumn == true) { dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0]; } dataGridView1.CurrentCell = dataGridView1[0, irow + 1]; } else { dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow]; } return true; } else if (keyData == Keys.Escape) { this.Close(); return true; } //below is for escape key return return base.ProcessCmdKey(ref msg, keyData); //below is for enter key return return base.ProcessCmdKey(ref msg, keyData); } 

Il suffit de copier et coller le code.

La seule chose que vous devriez avoir une grid dans votre formulaire.

Ce que vous pouvez faire est de gérer l’événement KeyDown pour vérifier si la touche Retour est enfoncée, d’annuler l’événement et d’indiquer à l’application d’utiliser l’index sélectionné de +1 dans votre datagridview:

 private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { int column = dataGridView1.CurrentCell.ColumnIndex; int row = dataGridView1.CurrentCell.RowIndex; dataGridView1.CurrentCell = dataGridView1[column, row+1]; e.Handled=true; } } 

Pour éviter les problèmes, vous devez également insérer une clause pour vérifier si des éléments sont disponibles après ceux sur lesquels l’utilisateur a appuyé sur le retour.

En utilisant cette solution:

 private void Form1_Load(object sender, EventArgs e) { dtg.AllowUserToAddRows = false; } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { int iCol = dtg.CurrentCell.ColumnIndex; int iRow = dtg.CurrentCell.RowIndex; if (keyData == Keys.Enter) { if (iCol == dtg.ColumnCount - 1) { if (iRow + 1 == dtg.RowCount) { dtg.Rows.Add(); } dtg.CurrentCell = dtg[0, iRow + 1]; } else { dtg.CurrentCell = dtg[iCol + 1, iRow]; } return true; } else if (keyData == Keys.Escape) { Close(); return true; } return base.ProcessCmdKey(ref msg, keyData); } 

Bonne chance …

car le keyDown envent ne se déclenchera pas lorsque vous appuierez sur la cellule datagridview, ce sera mieux grâce à @Nagarjun

 bool notlastColumn = true; protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg,System.Windows.Forms.Keys keyData) { int icolumn = dataGridView1.CurrentCell.ColumnIndex; int irow = dataGridView1.CurrentCell.RowIndex; int i = irow; if (keyData == Keys.Enter) { if (icolumn == dataGridView1.Columns.Count - 1) { //dataGridView1.Rows.Add(); if (notlastColumn == true) { dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0]; } dataGridView1.CurrentCell = dataGridView1[0, irow + 1]; } else { // to pass hidden cell, because will fire exception //exception: Current cell cannot be set to an invisible cell // the do while loop will enable you to pass any hidden cell do { icolumn++; } while (!dgv[icolumn, irow].Visible); dataGridView1.CurrentCell = dataGridView1[icolumn, irow]; } return true; } else if (keyData == Keys.Escape) { this.Close(); return true; } //below is for escape key return return base.ProcessCmdKey(ref msg, keyData); 

}

Il suffit de déplacer à droite lorsque la touche est enfoncée …

 private void datagridview_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { SendKeys.Send("{Right}"); } }