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

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

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

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

【问题讨论】:

    标签: .net winforms acceptbutton


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 1970-01-01
        • 2016-08-19
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多