DataGridView keydown事件无法在C#中工作

当我在单元格内编辑文本时,DataGridView keydown事件不起作用。

我正在分配快捷键Alt + S来保存数据,它在单元格不处于编辑模式时起作用,但如果它处于编辑模式下面,则代码不起作用

private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.Alt | Keys.S)) { //save data } } 

每当单元格处于编辑模式时,其托管控件都会接收KeyDown事件,而不是包含它的父DataGridView 这就是为什么当单元格不处于编辑模式时(即使它被选中)键盘快捷键正常工作,因为您的DataGridView控件本身会收到KeyDown事件。 但是,当您处于编辑模式时,单元格包含的编辑控件正在接收事件,并且没有任何反应,因为它没有附加自定义处理程序例程。

我花了太多时间调整标准的DataGridView控件来按照我想要的方式处理编辑提交,我发现解决这种现象的最简单方法是通过inheritance现有的DataGridView控件并覆盖其ProcessCmdKey函数 。 无论是否处于编辑模式,只要在DataGridView顶部按下某个键,您在此处输入的任何自定义代码都将运行。

例如,你可以这样做:

 class MyDataGridView : System.Windows.Forms.DataGridView { protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) { MessageBox.Show("Key Press Detected"); if ((keyData == (Keys.Alt | Keys.S))) { //Save data } return base.ProcessCmdKey(ref msg, keyData); } } 

另请参阅相关的,虽然有点旧,文章: 如何使用Visual C#来控制控件中的击键

另一种方法是使用EditingControlShowing事件将事件处理重定向到自定义事件处理程序,如下所示:

 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl tb) { tb.KeyDown -= dataGridView1_KeyDown; tb.KeyDown += dataGridView1_KeyDown; } } //then in your keydown event handler, execute your code private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.Alt | Keys.S)) { //save data } } 

我刚试过的一种更简单的方法如下:

  1. 将Form的KeyPreview属性设置为true
  2. 而不是在Grid上捕获KeyDown事件,而是捕获Form上的KeyDown事件。

代码如下:

 Private Sub form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown If grd.Focused Then 'Do your work End If End Sub 

这确实是EditingControlShowing可以提供帮助,但如果你想捕获Enter键则不行。 在这种情况下,应该使用以下方法:

  private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl) { DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl; tb.KeyDown -= dataGridView_KeyDown; tb.PreviewKeyDown -= dataGridView_PreviewKeyDown; tb.KeyDown += dataGridView_KeyDown; tb.PreviewKeyDown += dataGridView_PreviewKeyDown; } } void dataGridView_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyData == Keys.Enter) {  } } 

使用PreviewKeyDown事件

 private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { }