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

时间:2010-11-26 10:20:49

标签: c# .net winforms datagridview keydown

当我在单元格内编辑文本时,

DataGridView keydown事件无效。

我正在指定快捷键 Alt + S 来保存数据,当单元格不处于编辑模式时它会工作,但如果它处于编辑模式下面,则代码不能正常工作

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

6 个答案:

答案 0 :(得分:21)

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

我花了太多时间调整标准DataGridView控件以按照我想要的方式处理编辑提交,我发现解决这种现象的最简单方法是通过子类化现有DataGridView控制并覆盖其ProcessCmdKey function 。无论您是否处于编辑模式,只要在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);
    }
}

另请参阅相关的文章:How to trap keystrokes in controls by using Visual C#

答案 1 :(得分:14)

另一种方法是使用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
    }
 }

答案 2 :(得分:3)

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

  1. 将表单的KeyPreview属性设置为true
  2. 不要在Grid上捕获KeyDown事件,而是捕获Form上的KeyDown事件。
  3. 代码如下:

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

答案 3 :(得分:2)

这确实是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)
        {
            <your logic goes here>
        }
    }

答案 4 :(得分:0)

我用过这个

            private void grdViewOrderDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
              {
                grdViewOrderDetail_KeyDown(null,null);
              }

            private void grdViewOrderDetail_KeyDown(object sender, KeyEventArgs e)
              {
    
               //Code                     
              }

答案 5 :(得分:-2)

使用 PreviewKeyDown 事件

private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{

}