我知道这个问题(或其变体)已经出现过几次。但到目前为止,我还没有找到适合我的解决方案。
我正在使用包含DataGridView的C#编写Windows窗体UserControl,以将只读的员工数据集合呈现为一种美化的选择列表。网格是只读的(在control_load上填充)并将FullRowSelect设置为选择方法。我希望用户能够双击鼠标或使用当前行上的Enter键来选择Id值表单,该行将被订阅者接收以便在其他地方处理。
在分配我选择的员工值后处理KeyDown事件时,我尝试阻止选择移动到下一行。当CurrentCell.RowIndex为零时,此工作正常除。 有谁知道我如何才能使这个适用于CurrentCell.Rowindex = 0?
private void dgvEmployees_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (dgvEmployees.CurrentRow.Cells[0].Value != null)
{
this.SelectedEmployeeId = (int) dgvEmployees.CurrentRow.Cells[0].Value;
this.OnEmployeeSelected(new TestEmployeeGridListEventArgs() {
SelectedEmployeeId = this.SelectedEmployeeId,
SelectedEmployeeIdentifier = dgvEmployees.CurrentRow.Cells["Identifier"].Value.ToString()
});
}
// Prevent pressing <enter key> moving onto the next row.
if (dgvEmployees.CurrentCell.RowIndex > 0)
{
dgvEmployees.CurrentCell = dgvEmployees[1, dgvEmployees.CurrentCell.RowIndex - 1];
dgvEmployees.CurrentRow.Selected = true;
}
else
{
dgvEmployees.CurrentCell = dgvEmployees[1, 0];
dgvEmployees.Rows[0].Cells[1].Selected = true;
}
}
}
答案 0 :(得分:2)
感谢抬头的评论。我需要的只是设置e.Handled = true
或e.SuppressKeyPress = true
完整替换if (dgvEmployees.CurrentCell.RowIndex > 0)
语句。
if (e.KeyCode == Keys.Enter)
{
if (dgvEmployees.CurrentRow.Cells[0].Value != null)
{
this.SelectedEmployeeId = (int) dgvEmployees.CurrentRow.Cells[0].Value;
this.OnEmployeeSelected(new TestEmployeeGridListEventArgs() {
SelectedEmployeeId = this.SelectedEmployeeId,
SelectedEmployeeIdentifier = dgvEmployees.CurrentRow.Cells["Identifier"].Value.ToString()
});
}
e.SuppressKeyPress = true;
}
答案 1 :(得分:0)
只需尝试一下...。它完全可以在DatagridView CellEdit事件中工作,然后输入然后将焦点放在下一个单元格而不是行上。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// Check if Enter is pressed // DGV Cell Edit // dgv1 as DataGrideView
if (keyData == Keys.Enter /* && txtledger.Text != "" */)
{
try
{
if (dgv1.CurrentCell.ColumnIndex == 18 )
// 18 is Column Count and focusing length
{
dgv1.CurrentCell = dgv1.Rows[dgv1.CurrentRow.Index + 1 ].Cells[1];
return true;
}
else
{
SendKeys.Send("{Right}"); //Tab OR Right Key Ur Need
}
}
catch (Exception e)
{
dgv1.Rows.Add();
dgv1.CurrentCell = dgv1.Rows[dgv1.CurrentRow.Index].Cells[1];
}
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
这将正常工作。.它禁用了datagridview内部正常的回车键处理工作单元格编辑事件,以使同一行中的下一个单元格集中。如果有任何问题,请以您的形式检查所有keydown事件...