将 AcceptButton 设置为 None 仍然会在 ENTER 上关闭表单

Posted

技术标签:

【中文标题】将 AcceptButton 设置为 None 仍然会在 ENTER 上关闭表单【英文标题】:Setting AcceptButton to None still closes the form on ENTER 【发布时间】:2010-03-20 20:35:43 【问题描述】:

我有一个 MDI windows 窗体应用程序,我的子窗体大多有“确定”和“取消”按钮。但是,我不希望使用 ENTER/ESC 键激活它们以防止意外保存/中止。因此,表单将 AcceptButton 和 CancelButton 都设置为 none。 ESC 按钮确实什么都不做,但 ENTER 按钮仍然通过“单击”找到的第一个按钮关闭表单,按 TabOrder 排序。

为什么会这样?我真的必须开始做变通方法并抓住 ENTER 键吗?

补充:好的,这更奇怪了。 Reflector 告诉我,如果 Tab Order 的第一个控件(实际上是打开表单时默认处于活动状态的控件)是一个按钮,那么它将被分配为默认控件。否则什么都不会发生。现在问题变成了:WTF?!

【问题讨论】:

【参考方案1】:

当您将 AcceptButton/CancelButton 属性设置为 None 时,所有设计器都将 DialogResult 属性设置为您的按钮,并且不要清除它们。因此,您必须手动完成(在您的代码或设计器中)。

Button okButton = new Button();

// some code here

okButton.DialogResult = DialogResult.None;

【讨论】:

【参考方案2】:

听起来OK按钮是Tab顺序中的第一个控件,当表单加载时它会自动获得键盘焦点,这意味着按Enter键会单击它。如果您希望键盘焦点转到另一个控件,请尝试将 ActiveControl 属性设置为论坛上的另一个元素。

Button okButton = new Button();
TextBox someOtherControl = new TextBox();

// Add controls to form.
this.Controls.Add(okButton);
this.Controls.Add(someOtherControl);

// Specifically set the ActiveControl on the form.
this.ActiveControl = someOtherControl;

【讨论】:

不,不是那样。即使选择了另一个控件,ENTER 键也有效。正如我所说 - 它实际上是表单的 Default 按钮(这意味着“当用户按下 ENTER 时被点击的按钮”)。【参考方案3】:

我只是遇到了同样的问题。好久没用 WinForms 了,这么简单的东西我能不能少了点什么?

在我的情况下,我希望“确定”按钮在某些任务运行时不可见(或禁用),然后出现在最后......所以在开始时,只显示“取消”,它总是“接受”!无论我将 AcceptButton 设置为“Ok”还是“None”,并且在“Ok”出现在表单上之后 - 仍然“Cancel”对 Enter 起作用。如果两个按钮始终可见并启用 - 这是正确的。嗯...我认为它是正确的,但现在阅读此内容后,我尝试切换按钮顺序,是的,它是始终“接受”的第一个按钮。

看来 Form.AcceptButton 现在已经过时且未使用。不过,Form.CancelButton 仍在工作。我知道这是它在 html 中的工作方式,但在 WinForms 中......我有同样的“wtf”问题。 .NET 4.5。

【讨论】:

以上是关于将 AcceptButton 设置为 None 仍然会在 ENTER 上关闭表单的主要内容,如果未能解决你的问题,请参考以下文章

C# CancelButton 关闭对话框?

C#window窗体 用了AcceptButton后怎么去掉该按钮的边框

C#窗口的Form.AcceptButton 属性和Form.CancelButton 属性

C#窗口的Form.AcceptButton 属性和Form.CancelButton 属性

大师们,winform中的textbox按回车怎么触发Button?

2021-11-18 WinFrom面试题 如何设置窗体页面的默认提交按钮?