DataGridView - когда я нажимаю enter, он переходит к следующей ячейке
У меня есть datagridview с 5 столбцами, когда я нажимаю "enter", он переходит в следующую ячейку,и когда он прибывает в конец строк, когда я нажимаю enter, он добавляет новые строки, но моя проблема в том, когда я перемещаюсь в предыдущие строки после нажатия enter, он прыгает строки и не переходит к следующим ячейкам, любая помощь?
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];
}
}
}
}
7 ответов
забудьте о событии CellEnter и событии Form1_KeyPress. Просто обработайте dataGridView1_KeyDown событие вроде этого:
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;
}
}
обратите внимание, что я немного изменил код и не забудьте установить свойство Handled event в true, иначе он будет обрабатывать поведение по умолчанию.
Ура!
это работает для меня
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;
}
}
попробуйте использовать этот:
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);
}
просто скопируйте и вставьте код.
единственное, что вы должны иметь сетки в форме.
что вы можете сделать, это обработать событие KeyDown, чтобы проверить, нажата ли клавиша возврата, отменить событие и сообщить приложению использовать выбранный индекс +1 в вашем 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;
}
}
чтобы предотвратить проблемы, вы также должны вставить предложение, чтобы проверить, есть ли элементы, доступные после того, как пользователь нажал return.
используя это решение:
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);
}
Удачи ...
потому что keyDown envent не будет срабатывать при нажатии enter в ячейке datagridview это будет лучше всего благодаря @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);
}
просто переместитесь вправо при нажатии клавиши enter...
private void datagridview_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendKeys.Send("{Right}");
}
}