4

(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 );
    }
4

4 回答 4

7

另请注意,按 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。

于 2009-11-20T12:07:46.833 回答
5

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

于 2009-11-20T11:51:05.267 回答
3

这是默认行为。

来自 MSDN:

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

CancelButton 属性

于 2009-11-20T11:46:04.640 回答
1

不要尝试在 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 都是取消,但你可以做任何你觉得舒服的事情。

于 2011-02-21T20:34:24.170 回答