2010-03-20 41 views
1

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

这是为什么?我真的应该开始做解决方法并捕获ENTER键吗?

加:好吧,这是方式怪异的。 Reflector告诉我,如果Tab Order的第一个控件(当然,窗体打开时默认为活动的控件)是一个按钮,那么它将被指定为默认控件。否则没有任何反应现在问题变成:WTF?

回答

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; 
+0

不,不是的。即使选择了另一个控件,ENTER键仍然有效。正如我所说 - 它实际上做了窗体的**默认**按钮(这意味着“用户按下ENTER时被按下的按钮”)。 – 2010-03-24 09:43:41

0

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

Button okButton = new Button(); 

// some code here 

okButton.DialogResult = DialogResult.None; 
0

我只是被困在同样的问题上。很长一段时间没有使用WinForms,我以为可以在这么简单的事情中错过什么吗?

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

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

相关问题