我有一个填充了DataTable的DataGridView,有10列。当我单击Enter键时,我有一个从一行移动到另一行的情况,然后我需要选择该行并且需要具有该行值。
但是当我选择 n -th行时,它会自动移动到 n + 1 行。
请帮助我...
在页面加载事件中
SqlConnection con =
new SqlConnection("Data Source=.;Initial Catalog=MHS;User ID=mhs_mt;Password=@mhsinc");
DataSet ds = new System.Data.DataSet();
SqlDataAdapter da = new SqlDataAdapter("select * from MT_INVENTORY_COUNT", con);
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
然后,
private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
int i = dataGridView1.CurrentRow.Index;
MessageBox.Show(i.ToString());
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int i = dataGridView1.CurrentRow.Index;
MessageBox.Show(i.ToString());
}
答案 0 :(得分:5)
这是DataGridView的默认行为,也是第三方供应商在其他数据网格中的标准。
以下是发生的事情:
因此,当按下回车键时,当前单元格已经改变。
如果要在DataGridView更改行之前获取用户所在的行,可以使用以下命令。这应该适合您现有的代码(显然您需要为它添加事件处理程序):
void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
int i = dataGridView1.CurrentRow.Index;
MessageBox.Show(i.ToString());
}
}
我希望这有助于指明你正确的方向。不知道你希望在这里做什么,但希望这能解释你所看到的情况。
答案 1 :(得分:2)
使用以下代码添加一个类并修改您的GridView设计器页面,即
this.dataGridView1 = New System.Windows.Forms.DataGridView();
到
this.dataGridView1 = new GridSample_WinForms.customDataGridView();
类文件是:
class customDataGridView : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Enter)
{
int col = this.CurrentCell.ColumnIndex;
int row = this.CurrentCell.RowIndex;
this.CurrentCell = this[col, row];
return true;
}
return base.ProcessDialogKey(keyData);
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
int col = this.CurrentCell.ColumnIndex;
int row = this.CurrentCell.RowIndex;
this.CurrentCell = this[col, row];
e.Handled = true;
}
base.OnKeyDown(e);
}
}
答案 2 :(得分:0)
以下解决方案更简单,也可以使用:
在.Designer.cs文件中:
this.dataGridView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dataGridView1_KeyDown);
在文件后面的代码中:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
// Handle event
e.Handled = true;
}
}