C#CancelButton关闭对话框?

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

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

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

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

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

这是默认行为。

来自MSDN:

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

CancelButton Property

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

 MyForm_FormClosing(object sender, FormClosingEventArgs e) { if (DialogResult == DialogResult.Cancel) { // do my processing ... if (false) e.Cancel = true; // stop the form from closing } } 

我也在这里处理我的Accept按钮代码,我假设一切!= DialogResult.OK是取消,但你可以做任何适合你的事情。