首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中的DataGridView按键事件不起作用

C#中的DataGridView按键事件不起作用
EN

Stack Overflow用户
提问于 2010-11-26 18:20:49
回答 6查看 33.8K关注 0票数 20

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

我正在分配快捷方式Alt+S来保存数据,当单元格不处于编辑模式时,它可以工作,但如果它处于编辑模式,下面的代码就不能工作

代码语言:javascript
复制
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
 {
    if (e.KeyData == (Keys.Alt | Keys.S))
    {
         //save data
    }
 }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-26 19:59:31

每当单元格处于编辑模式时,其宿主控件都会接收 DataGridView 事件,而不是接收包含该事件的父。这就是每当单元格未处于编辑模式(即使它处于选中状态)时键盘快捷键仍然起作用的原因,因为DataGridView控件本身会接收KeyDown事件。但是,当您处于编辑模式时,单元格包含的编辑控件正在接收事件,并且不会发生任何事情,因为它没有附加自定义处理程序例程。

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

例如,您可以这样做:

代码语言:javascript
复制
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#

票数 24
EN

Stack Overflow用户

发布于 2013-03-13 11:37:41

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

代码语言:javascript
复制
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
    }
 }
票数 15
EN

Stack Overflow用户

发布于 2015-05-19 21:35:32

确实,EditingControlShowing可以提供帮助,但如果您想要抓住Enter键,则不能。在这种情况下,应该使用以下方法:

代码语言:javascript
复制
 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>
        }
    }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4284370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档