当DataGridView具有焦点时,如何触发“接受”按钮?

时间:2012-03-19 15:18:32

标签: c# winforms button datagridview

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

enter image description here

  • 我已将表单的AcceptButton属性设置为OK按钮,将表单的CancelButton属性设置为Cancel按钮。
  • 我已将OK按钮的DialogResult属性设置为“OK”,并将Cancel按钮的DialogResult属性设置为“Cancel”

如果文本框具有焦点,则按Enter键将使用DialogResult为OK关闭表单。但是,如果DataGridView具有焦点,则按Enter键不会关闭表单。

但是,按Esc键会导致表格以DialogResult取消结束。

这是一个两部分问题:

  1. 当DataGridView具有焦点时,Enter键的行为不一致的原因是什么?
  2. 当DataGridView具有焦点时,如何使用Enter来关闭具有OK的DialogResult的表单?

4 个答案:

答案 0 :(得分:6)

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 :(得分:3)

  1. 我认为输入是数据输入的有效密钥,以及选项卡,以及他们希望为最常用于键盘的用户保留的密钥,而不是指向和点击。

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

答案 2 :(得分:3)

  1. 如果DataGridView为Enter,则KeyDown的单元格会在内部处理KeyCode事件(如果单元格处于编辑模式,按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();
        }
    }
    

答案 3 :(得分:0)

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

您应该这样做的方法是向表单添加一个按键事件,以便按下Enter / Escape键。

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

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();
        }
    }