我有一个datagridview(dgv)并为它设置了一些快捷方式。我想在dgv selectedIndexChanged
时得到我想要的单元格值。
这就是我为selectedIndexChanged
事件所做的事情:
if (dgv.Rows.Count > 0)
{
lblId.Text = dgv.CurrentRow.Cells[0].Value.ToString();
lblStaffName.Text = dgv.CurrentRow.Cells[1].Value.ToString();
lblStock.Text = dgv.CurrentRow.Cells[4].Value.ToString();
}
并为我的dgv定义了一些快捷方式。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Alt | Keys.Down))
{
if (dgv.Rows.Count > 0)
{
dgv.Focus();
if (dgv.CurrentRow.Index < (dgv.Rows.Count - 1))
{
dgv.Rows[dgv.CurrentRow.Index + 1].Selected = true;
dgv.FirstDisplayedScrollingRowIndex = dgv.CurrentRow.Index + 1;
pnl.BackColor = Color.FromKnownColor(KnownColor.Lime);
}
}
}
}
注意:正如您所看到的,当我按Alt+keyDown
时,dgv索引会增加并更改为更多一步。
我的问题是当我按下Alt+keyDown
索引更改并选择了但是值不会获得新值,直到我再次按Alt+keyDown
两次!
有没有必须在那里编写代码的事件?谢谢:))
答案 0 :(得分:1)
要更改数据绑定DataGridView
中的所选索引,最好以这种方式依赖绑定上下文:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Alt | Keys.Down))
{
var bc = dgv.BindingContext[dgv.DataSource, dgv.DataMember];
if (bc.Position < bc.Count - 1)
bc.Position++;
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
但是如果DataGridView
不是数据绑定或只是为了学习目的而你想修复你的代码,你可以编写这样的代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Alt | Keys.Down))
{
if (dgv.CurrentCell == null)
{
if (dgv.ColumnCount >= 1 && dgv.RowCount >= 1)
{
dgv.CurrentCell = dgv[0, 0];
return true;
}
}
else
{
var rowIndex = dgv.CurrentCell.RowIndex;
var columnIndex = dgv.CurrentCell.ColumnIndex;
if (rowIndex < dgv.RowCount - 1)
{
dgv.CurrentCell = dgv[columnIndex, rowIndex + 1];
return true;
}
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
我还删除了dgv.Focus()
,因为当您使用快捷方式在行之间导航时,您不需要关注,但如果您因任何原因需要它,请使用它。