【问题标题】:The Enter Key does not close a Form if the Focus is on a Button that is not the AcceptButton如果焦点位于不是 AcceptButton 的按钮上,则 Enter 键不会关闭表单
【发布时间】:2021-01-13 10:43:38
【问题描述】:

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

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

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

我有两个选择:

  1. Enter 将始终关闭表单(选择焦点按钮然后关闭它),

  2. 第一次按下 Enter 键将选择焦点按钮,第二次按下 ENTER 将关闭表单。问题是可能选择了 Button A,但用户可以使用箭头键查看 Button BC

我无法将DialogResult.OK 设置为其他按钮,因为在这种情况下,正常单击也会关闭表单,我无法检测是否由于 Click 事件或ENTER键...

【问题讨论】:

  • 向我们展示您编写的代码。

标签: c# winforms dialogresult acceptbutton


【解决方案1】:

如果您想激活默认按钮 - 设置为表单的AcceptButton 的按钮 - 当另一个按钮具有焦点,但没有另一个控件时,作为文本框,可能希望接受 Enter 键,您可以覆盖ProcessCmdKey(因为按下 Enter 键不会引发KeyDown 事件,并且Click 事件在KeyUp 事件之前引发),验证 ActiveControl 是否为 Button 类型(或您希望以相同方式运行的其他类型的控件)并将 ActiveControl 设置为您的 AcceptButton

Enter 键被传送AcceptButton 并且对话框关闭,返回DialogResult.OK(因为您已经设置了按钮的DialogResult 值) :

注意:这里假设Container Control是一样的。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Enter) {
        if (this.ActiveControl.GetType() == typeof(Button) &&
            this.ActiveControl != this.AcceptButton) {
            this.ActiveControl = this.AcceptButton as Button;
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

如果您只想更改ActiveControl,请将焦点设置为AcceptButton - 因此用户需要按两次Enter键确认,然后返回true已更改ActiveControl,以表明输入已被处理:

// [...]
if (keyData == Keys.Enter) {
    if (...) {
        this.ActiveControl = this.AcceptButton as Button;
        return true;
    }
}
return base.ProcessCmdKey(ref msg, keyData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多