【问题标题】:How do I get "Accept" button to fire when DataGridView has focus?当 DataGridView 有焦点时,如何让“接受”按钮触发?
【发布时间】:2012-04-04 02:14:43
【问题描述】:

我将一个表单呈现为一个对话框。该表单包含一个 DataGridView、一个 TextBox 和 OK/Cancel 按钮,如下所示:

  • 我已将表单的 AcceptButton 属性设置为“确定”按钮,将表单的 CancelButton 属性设置为“取消”按钮。
  • 我已将确定按钮的 DialogResult 属性设置为“确定”,将取消按钮的 DialogResult 属性设置为“取消”

如果文本框有焦点,则按 Enter 会关闭表单,并显示 DialogResult 为 OK。但是,如果 DataGridView 具有焦点,则按 Enter 不会关闭表单。

但是,按 Escape 键总是会导致表单以 Cancel 的 DialogResult 关闭。

这是一个两部分的问题:

  1. DataGridView 有焦点时回车键行为不一致的原因是什么?
  2. 当 DataGridView 获得焦点时,如何使 Enter 关闭表单并显示 OK 的 DialogResult?

【问题讨论】:

    标签: c# winforms button datagridview


    【解决方案1】:

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

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

    这仍然为您留下用于导航的箭头键,并且仍然允许用户添加新行(只要在网格的底部行中输入数据,新行就会出现)。

    【讨论】:

    • +1 提到我需要设置 e.Handled = true。如果您不这样做,DataGridView 仍会处理按键。
    【解决方案2】:
    1. 我认为 enter 是数据输入的有效键,与 tab 一起,他们希望为最习惯使用键盘的用户保留一个键,而不是指向和单击。

    2. 您是否尝试过在您的按键事件处理程序中添加对PerformClick() 的调用?

    【讨论】:

      【解决方案3】:
      1. DataGridView 的单元格在内部处理 KeyDown 事件,如果 KeyCode 是 Enter(如果单元格处于编辑模式,按 Enter 表示“我已经完成了单元格的编辑”。如果整行正在选择,按 Enter 表示“添加新行”)。
      2. 我假设您不想在用户按 Enter 时添加新行。首先将DataGridView.AllowUsersToAddNewRows属性设置为false,这样用户就不会得到任何意外行为,然后处理DataGridView.KeyDown事件并在事件引发时手动按下按钮KeyCode.Enter

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

      【讨论】:

        【解决方案4】:

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

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

        这是为了在后面的代码中添加按键事件(可以使用设计器)。

        this.KeyPress += new KeyPressEventHandler(Form1_KeyPress);
        

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

        void SelectionPageForAutomation_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar == Key.Escape)
                {
                    btn_Cancel.PerformClick();
                }
                else if(e.KeyChar == Key.Enter){
                    btn_Okay.PerformClick();
                }
            }
        

        【讨论】:

        • 表单的 AcceptButton 和 CancelButton 属性已经提供了这个功能。问题是当 DataGridView 有焦点时这不起作用。
        猜你喜欢
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多