0

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

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

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

我有两个选择:

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

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

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

4

1 回答 1

0

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

Enter密钥转移AcceptButtonDialog 并关闭,返回DialogResult.OK(因为您已经设置了 Button 的值DialogResult):

注意:这假设容器控件是相同的。

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);
于 2020-09-27T21:02:23.020 回答