按ENTER键阻止Windows窗体DataGridView移动到下一行

我知道这个问题(或其变体)已经出现过几次。 但到目前为止,我还没有找到适合我的解决方案。

我正在使用包含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  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; } } } 

感谢Reniuz的领导。 我需要的只是设置e.Handled = truee.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; } 

试试这个….它完全在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事件…