C# CancelButton 关闭对话框?

Posted

技术标签:

【中文标题】C# CancelButton 关闭对话框?【英文标题】:C# CancelButton closes dialog? 【发布时间】:2009-11-20 11:42:29 【问题描述】:

(VS2005,.Net 2.0)

我有一个使用 ShowDialog() 方法显示为对话框的表单。窗体的 CancelButton 属性设置为窗体上的按钮。即使我将该按钮的 DialogResult 设置为 None,单击该按钮仍会关闭对话框。我不希望这种情况发生 - 我希望能够控制对话框是否关闭。

表单的 AcceptButton 不会出现此问题 - 将该按钮的 DialogResult 设置为 none,我可以进行必要的处理,然后决定是否手动设置表单的 DialogResult 以使其关闭。

我认为 CancelButton 属性仅用于指示在按下 Escape 时应“单击”的按钮(就像 AcceptButton 仅应指示在按下 Enter 时“单击”的按钮)。我错了吗?我是否错过了表单关闭的其他原因?或者这是一个错误?

编辑:添加代码。这是带有取消按钮(按钮 1)的对话框(表格 2)。 取消按钮只是表单的CancelButton,它没有设置DialogResult为Cancel,但是按下按钮还是会关闭表单

    private void InitializeComponent()
    
        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // button1
        // 
        this.button1.Name = "button1";
        this.button1.Text = "button1";
        // 
        // Form2
        // 
        this.CancelButton = this.button1;
        this.Controls.Add( this.button1 );
        this.Name = "Form2";
        this.Text = "Form2";
        this.ResumeLayout( false );
    

【问题讨论】:

我认为你需要发布一些代码 【参考方案1】:

另外请注意,可能会通过按 Alt+F4 并按 X 按钮来关闭表单,这两种方式都不会触发取消按钮单击事件。

除非您也在处理这些情况,否则最好遵循 slurdge 的建议并防止表单在 FormClosing 事件中关闭。

编辑: 另请注意,如果在“属性”窗口中将按钮的 DialogResult 更改回“无”,则将其更改为默认值。如果该值是该属性的默认值,则它不会保留在 *.Designer.cs 中。即使它被持久化,表单初始化代码也会放在 *.Designer.cs 中的最后,并且会因为以下行而用 Cancel 覆盖 None:

this.CancelButton = this.button1;

正如您可以在 Reflector 中检查的那样,上一行是这样做的:

public void set_CancelButton(IButtonControl value)

    base.Properties.SetObject(PropCancelButton, value);
    if ((value != null) && (value.DialogResult == DialogResult.None))
    
        value.DialogResult = DialogResult.Cancel;
    

您可以在 InitializeComponent() 调用后在构造函数中将其改回 None。

【讨论】:

嗯。我隐藏了 X 按钮,但没有意识到 Alt-F4 会关闭对话框。确实,slurdge 的实用解决方案似乎是最好的,但我仍然很好奇为什么/何时将按钮的 DialogResult 设置为 Cancel,而我在设计器中将其更改为 None。 我认为您的编辑最接近于解释正在发生的事情,在运行时设置的 CancelButton 属性也设置了按钮的 DialogResult。我仍然对为什么会发生这种情况一无所知,但如果没有问微软的人,我不确定我会得到答案。【参考方案2】:

您似乎想要执行表单关闭的验证。 FormClosing 事件非常适合这一点。这将使您能够使用相同的代码来控制是否关闭。 只需将 Cancel 属性设置为 true 以防止关闭。 见FormClosing。

【讨论】:

这很方便,可能我最终会这样做。不过,我真正关心的是为什么按钮会导致表单首先关闭,而我并没有告诉它这样做。【参考方案3】:

这是默认行为。

来自 MSDN:

此属性允许您指定当用户在您的应用程序中按下 ESC 键时发生的默认操作。您可以使用此属性让用户快速浏览简单的表单,只需按下 ESC 键即可关闭窗口而不提交更改,而不是用鼠标手动单击取消按钮。

CancelButton Property

【讨论】:

我读到“按下 Esc 时按下此按钮 - 按下按钮可能涉及关闭表单”,而不是“按下 Esc 时按下此按钮,我们按下按钮自己关闭表单”。 你检查了 URL,它还包含一个社区内容。[我没有注意到 ;)] 在 Visual Studio 设计器中将按钮设置为 CancelButton 也有设置的副作用DialogResult 的按钮取消。对于模态对话框,这将在单击按钮时自动导致表单关闭。要防止表单关闭,请清除 DialogResult 属性或在单击处理程序中使用此代码:this.DialogResult = DialogResult.None; 嗯。我注意到在设计器中设置 CancelButton 也会将按钮的 DialogResult 设置为 Cancel。但是,即使您随后在设计器中将按钮的 DialogResult 更改为 None,它仍然会关闭窗口。事实上,在调试时,我注意到 - 即使在 Designer 中将按钮的 DialogResult 设置为 none - 按钮的 DialogResult 仍然是 Cancel。这是怎么回事? 是的,它只是这样工作的。我解决了它,就像我修改了 Window.Designer.cs 并将按钮的 dialogResult 设置为 None 一样。我还在 FormLoad 上将其设置为无。现在它对我来说很好:) 是的……我明白了。如果我在 FormLoad 上将按钮的 DialogResult -back- 设置为 None ,那么它会粘住(但如果我只是在设计器代码中设置它则不会)。所以在运行程序和加载表单之间的某个地方,按钮的 DialogResult 设置为 Cancel 纯粹是因为它是表单的 Cancel 按钮...【参考方案4】:

不要尝试在 button_click 事件中处理它,而是在 form_closure 事件中处理它。

MyForm_FormClosing(object sender, FormClosingEventArgs e)

   if (DialogResult == DialogResult.Cancel)
   
      // do my processing ...
      if (false)
         e.Cancel = true;   // stop the form from closing
   

我也在这里处理我的接受按钮代码,我假设任何事情!= DialogResult.OK 是取消,但你可以做任何你觉得舒服的事情。

【讨论】:

以上是关于C# CancelButton 关闭对话框?的主要内容,如果未能解决你的问题,请参考以下文章

在c#中的TextBox响应回车键发出“咚”的一声解决方法

C# WinForm 怎么设置弹出对话框然后2秒后自动关闭

在c#中使用word为啥在关闭时总是显示“另存为”对话框

C#中对话框自动关闭的一种方法。

C# WinForm 怎么设置弹出对话框然后2秒后自动关闭

C# WPF 建立渐隐窗口