如果焦点位于不是接受按钮的按钮上,则 Enter 键不会关闭表单

The Enter Key does not close a Form if the Focus is on a Button that is not the AcceptButton

我有一个带有三个按钮 A B 和 C 的模态表单。

此外,我还有两个按钮:OKCancelOK 按钮的 DialogResult 属性 设置为 DialogResult.OKCancel 按钮 DialogResult.Cancel.
窗体的 AcceptButtonCancelButton 属性设置为这些按钮。

目前,当我按下 ESC 键时表单关闭,但如果我在其他按钮(A、B、C)之一是活动控件时单击 ENTER 键,表格没有关闭。我该如何克服这个问题?

我有两个选择:

  1. Enter 将始终关闭表单(select 聚焦按钮然后关闭它),

  2. 第一次按下 Enter 键将 select 聚焦按钮,第二次 ENTER 按下将关闭表单。问题是 Button A 可能被 selected 但用户可以使用箭头键遍历 Button BC

我无法为其他按钮设置 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);