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

时间:2010-03-20 20:35:44

标签: .net winforms acceptbutton

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

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

已添加:好的,这是更奇怪的方式。 Reflector告诉我,显然,如果Tab Order的第一个控件(实际上是打开表单时默认处于活动状态的控件)是一个按钮,那么它将被指定为默认控件。否则没有任何反应现在问题变成:WTF?!

3 个答案:

答案 0 :(得分:1)

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

Button okButton = new Button();

// some code here

okButton.DialogResult = DialogResult.None;

答案 1 :(得分:0)

听起来,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;

答案 2 :(得分:0)

我只是坚持同样的问题。很长一段时间没有使用WinForms,我想我可以在这么简单的事情中遗漏一些东西吗?

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

看起来Form.AcceptButton现在已经过时且未使用。尽管如此,Form.CancelButton还在努力工作。我知道这是它在HTML中的工作方式,但在WinForms中......我有同样的“wtf”问题。 .NET 4.5。