Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能得到;接受;DataGridView具有焦点时触发的按钮?_C#_Winforms_Button_Datagridview - Fatal编程技术网

C# 我怎样才能得到;接受;DataGridView具有焦点时触发的按钮?

C# 我怎样才能得到;接受;DataGridView具有焦点时触发的按钮?,c#,winforms,button,datagridview,C#,Winforms,Button,Datagridview,我将表单显示为对话框。该表单包含DataGridView、文本框和确定/取消按钮,如下所示: 我已经将表单的AcceptButton属性设置为OK按钮,将表单的CancelButton属性设置为Cancel按钮 我已将OK按钮的DialogResult属性设置为“OK”,将Cancel按钮的DialogResult属性设置为“Cancel” 如果文本框有焦点,则按Enter键关闭窗体,对话框结果为OK。但是,如果DataGridView具有焦点,则按Enter键不会关闭窗体 但是,按Esc

我将表单显示为对话框。该表单包含DataGridView、文本框和确定/取消按钮,如下所示:

  • 我已经将表单的AcceptButton属性设置为OK按钮,将表单的CancelButton属性设置为Cancel按钮
  • 我已将OK按钮的DialogResult属性设置为“OK”,将Cancel按钮的DialogResult属性设置为“Cancel”
如果文本框有焦点,则按Enter键关闭窗体,对话框结果为OK。但是,如果DataGridView具有焦点,则按Enter键不会关闭窗体

但是,按Escape键总是导致窗体关闭,对话框结果为Cancel

这是一个由两部分组成的问题:

  • 当DataGridView具有焦点时,Enter键行为不一致的原因是什么
  • 当DataGridView具有焦点时,如何使Enter在对话框Result为OK的情况下关闭窗体
  • 我认为enter是一个有效的数据输入键和tab键,他们希望为那些最习惯键盘的用户保留这个键,而不是点击

  • 您是否尝试过在按键关闭事件处理程序中添加对的调用


  • DataGridView
    使用enter键移动到当前正在编辑的单元格下方的单元格。没有单个属性可以更改此行为,但可以覆盖网格的键控行为:

    dataGridView1.KeyDown += new KeyEventHandler(dataGridView1_KeyDown);
    
    void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            button1.PerformClick();
            e.Handled = true;        
        }    
    }
    

    这仍然让您可以使用箭头键进行导航,并且仍然允许用户添加新行(在网格底部一行输入数据时,新行就会出现)。

    我不确定我是否完全理解这个问题,但我会尽全力。如果我遗漏了什么,请告诉我

    您应该这样做的方式是在表单中添加一个按键事件来处理Enter/Escape按键

    这用于在代码隐藏中添加按键事件(可以使用设计器)

    事件处理程序可以是这样的:

    void SelectionPageForAutomation_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Key.Escape)
            {
                btn_Cancel.PerformClick();
            }
            else if(e.KeyChar == Key.Enter){
                btn_Okay.PerformClick();
            }
        }
    
  • 如果输入了
    KeyCode
    ,则
    DataGridView
    的单元格在内部处理
    KeyDown
    事件(如果单元格处于编辑模式,按Enter表示“我已完成编辑单元格”。如果选择整行,按Enter表示“添加新行”)
  • 我假设当用户按Enter键时,您不想添加新行。首先将
    DataGridView.AllowUsersToAddNewRows
    属性设置为false,以便用户不会获得任何意外行为,然后处理
    DataGridView.KeyDown
    事件,并在使用
    KeyCode引发事件时手动按下按钮。输入

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Enter)
        {
            button1.PerformClick();
        }
    }
    

  • 表单的AcceptButton和CancelButton属性已经提供了此功能。问题是,当DataGridView有焦点时,这不起作用。+1表示我需要设置e.Handled=true。如果不这样做,DataGridView仍会处理按键。
    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Enter)
        {
            button1.PerformClick();
        }
    }