我将一个表单作为对话框呈现。该表单包含DataGridView,TextBox和OK / Cancel按钮,如下所示:
如果文本框具有焦点,则按Enter键将使用DialogResult为OK关闭表单。但是,如果DataGridView具有焦点,则按Enter键不会关闭表单。
但是,按Esc键会导致表格以DialogResult取消结束。
这是一个两部分问题:
答案 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)
我认为输入是数据输入的有效密钥,以及选项卡,以及他们希望为最常用于键盘的用户保留的密钥,而不是指向和点击。
您是否尝试过添加对PerformClick()的调用,可能是在您的按键事件处理程序中?
答案 2 :(得分:3)
DataGridView
为Enter,则KeyDown
的单元格会在内部处理KeyCode
事件(如果单元格处于编辑模式,按Enter键表示“我已完成编辑单元格“。如果选择整行,按Enter表示”添加新行“。)我假设您不想在用户按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();
}
}