如果焦点位于不是接受按钮的按钮上,则 Enter 键不会关闭表单
The Enter Key does not close a Form if the Focus is on a Button that is not the AcceptButton
我有一个带有三个按钮 A B 和 C 的模态表单。
此外,我还有两个按钮:OK
和 Cancel
。 OK
按钮的 DialogResult
属性 设置为 DialogResult.OK
,Cancel
按钮 DialogResult.Cancel
.
窗体的 AcceptButton
和 CancelButton
属性设置为这些按钮。
目前,当我按下 ESC
键时表单关闭,但如果我在其他按钮(A、B、C)之一是活动控件时单击 ENTER
键,表格没有关闭。我该如何克服这个问题?
我有两个选择:
Enter 将始终关闭表单(select 聚焦按钮然后关闭它),
第一次按下 Enter 键将 select 聚焦按钮,第二次 ENTER
按下将关闭表单。问题是 Button A
可能被 selected 但用户可以使用箭头键遍历 Button B
或 C
。
我无法为其他按钮设置 DialogResult.OK
,因为 - 在那种情况下 - 正常点击也会关闭表单,我无法检测事件是否因为单击事件或 ENTER
键...
如果您想激活默认按钮 - 设置为表单 AcceptButton - when another Button has the Focus, but not another Control, as a TextBox, that may want to accept the Enter key, you can override ProcessCmdKey (since pressing the Enter key doesn't raise the KeyDown
event and the Click
event is raised before the KeyUp
event), verify whether the ActiveControl 的按钮属于按钮类型(或您希望以相同方式运行的其他类型的控件)并设置 ActiveControl
到你的 AcceptButton
.
Enter 键 转移 到 AcceptButton
并且对话框关闭,returning DialogResult.OK
(因为您已经设置了按钮的 DialogResult
值):
注意:这里假设Container Control是一样的。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter) {
if (ActiveControl.GetType() == typeof(Button) &&
ActiveControl != AcceptButton) {
ActiveControl = AcceptButton as Button;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
如果您只想更改 ActiveControl
,将焦点设置为 AcceptButton
- 因此用户需要按两次 Enter 键确认,return true
在您更改 ActiveControl
之后,发出输入已被处理的信号:
// [...]
if (keyData == Keys.Enter) {
if (...) {
ActiveControl = AcceptButton as Button;
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
我有一个带有三个按钮 A B 和 C 的模态表单。
此外,我还有两个按钮:OK
和 Cancel
。 OK
按钮的 DialogResult
属性 设置为 DialogResult.OK
,Cancel
按钮 DialogResult.Cancel
.
窗体的 AcceptButton
和 CancelButton
属性设置为这些按钮。
目前,当我按下 ESC
键时表单关闭,但如果我在其他按钮(A、B、C)之一是活动控件时单击 ENTER
键,表格没有关闭。我该如何克服这个问题?
我有两个选择:
Enter 将始终关闭表单(select 聚焦按钮然后关闭它),
第一次按下 Enter 键将 select 聚焦按钮,第二次
ENTER
按下将关闭表单。问题是 ButtonA
可能被 selected 但用户可以使用箭头键遍历 ButtonB
或C
。
我无法为其他按钮设置 DialogResult.OK
,因为 - 在那种情况下 - 正常点击也会关闭表单,我无法检测事件是否因为单击事件或 ENTER
键...
如果您想激活默认按钮 - 设置为表单 AcceptButton - when another Button has the Focus, but not another Control, as a TextBox, that may want to accept the Enter key, you can override ProcessCmdKey (since pressing the Enter key doesn't raise the KeyDown
event and the Click
event is raised before the KeyUp
event), verify whether the ActiveControl 的按钮属于按钮类型(或您希望以相同方式运行的其他类型的控件)并设置 ActiveControl
到你的 AcceptButton
.
Enter 键 转移 到 AcceptButton
并且对话框关闭,returning DialogResult.OK
(因为您已经设置了按钮的 DialogResult
值):
注意:这里假设Container Control是一样的。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter) {
if (ActiveControl.GetType() == typeof(Button) &&
ActiveControl != AcceptButton) {
ActiveControl = AcceptButton as Button;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
如果您只想更改 ActiveControl
,将焦点设置为 AcceptButton
- 因此用户需要按两次 Enter 键确认,return true
在您更改 ActiveControl
之后,发出输入已被处理的信号:
// [...]
if (keyData == Keys.Enter) {
if (...) {
ActiveControl = AcceptButton as Button;
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);