C#CancelButton关闭对话框?

Raw*_*ing 4 c# modal-dialog cancel-button

(VS2005,.Net 2.0)

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

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

我认为如果按下Escape,则CancelButton属性意味着指示应该"点击"的按钮(就像在按下Enter时,AcceptButton只应指示按钮"点击").我错了吗?我错过了我的表格结束的其他原因吗?或者这是一个错误?

编辑:添加了代码.这是带有取消按钮(按钮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 );
    }
Run Code Online (Sandbox Code Playgroud)

Joã*_*elo 7

还要注意,可以通过按Alt + F4并按下X按钮关闭表单,两种方式都不会触发取消按钮单击事件.

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

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

this.CancelButton = this.button1;
Run Code Online (Sandbox Code Playgroud)

正如您可以在Reflector中检查前一行执行此操作:

public void set_CancelButton(IButtonControl value)
{
    base.Properties.SetObject(PropCancelButton, value);
    if ((value != null) && (value.DialogResult == DialogResult.None))
    {
        value.DialogResult = DialogResult.Cancel;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您似乎想要执行表单关闭的验证.
FormClosing事件非常适合这种情况.这将使您能够使用相同的代码来控制关闭与否.
只需将Cancel属性设置为true即可阻止关闭.请参见FormClosing.