2009-11-20 118 views
4

(VS2005,.Net 2.0)C#CancelButton关闭对话框?

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

此问题不会发生与窗体的AcceptButton - 与该按钮的DialogResult设置为无,我可以做什么处理是必要的,然后决定是否手动设置窗体的DialogResult导致它关闭。

我以为CancelButton属性意思是soley,表示按下Escape键时应该“点击”的按钮(很像AcceptButton只是表示按下Enter时按下“click”按钮)。我错了吗?我错过了我的表单正在关闭的其他原因吗?或者这是一个错误?

编辑:添加代码。这是带取消按钮(按钮1)的对话窗体(窗体2)。 取消按钮只是形式的CancelButton,它不具备的DialogResult设置为取消,但按下按钮仍然关闭窗体

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

我认为你需要发表一些代码 – ChrisF 2009-11-20 11:44:16

回答

7

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

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

编辑: 另请注意,如果您在属性窗口中将按钮的DialogResult更改回无,您将更改为默认值。如果该值是该属性的默认值,那么它将不会保留在* .Designer.cs中。即使它被持久化了,表单初始化代码也会放在* .Designer中。CS和将覆盖与无取消,因为该行的:

this.CancelButton = this.button1; 

正如你可以在反射镜检查前行做到这一点:

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

您可以在构造后改回为无InitializeComponent()调用。

+0

嗯。我隐藏了X按钮,但没有意识到Alt-F4会关闭对话框。事实上,slurdge的实际解决方案似乎是最好的,但我仍然好奇为什么/当按钮的DialogResult被设置为Cancel时,我在设计器中将其更改为None。 – Rawling 2009-11-20 12:15:29

+0

请参阅我的答案的编辑。 – 2009-11-20 12:25:16

+0

我认为你的编辑最接近于解释发生了什么,在运行时设置CancelButton属性也设置按钮的DialogResult。 我仍然处于黑暗中,为什么会发生这种情况,但没有向Microsoft发问,我不确定我会得到答案。 – Rawling 2009-11-20 12:33:18

2

这是默认的行为。

从MSDN:

此属性允许您指定当用户按下应用程序中的ESC键进行默认操作。您可以使用此属性来允许用户快速导航一个简单的表单,只需按下ESC键即可关闭一个窗口而无需进行更改,而无需用鼠标手动点击取消按钮。

CancelButton Property

+0

我读到“当按下Esc时按下此按钮 - 按下按钮可能涉及关闭窗体”,而不是“按下Esc时按下此按钮,我们使按钮按下自己关闭窗体“。 – Rawling 2009-11-20 11:52:25

+1

您是否检查过URL,它还包含社区内容[我没有注意到;]] 将按钮设置为Visual Studio设计器中的CancelButton也具有将按钮的DialogResult设置为取消。对于模式对话框,这会自动导致窗体在点击按钮时关闭。要阻止窗体关闭,请清除DialogResult属性或在您的点击处理程序中使用此代码: this.DialogResult = DialogResult.None; – Anuraj 2009-11-20 12:03:55

+0

嗯。 我注意到在设计器中设置CancelButton也会将按钮的DialogResult设置为Cancel。 但是,即使您将设计器中的按钮的DialogResult更改为无,仍然会关闭该窗口。实际上,在调试时,我注意到 - 即使在Designer中将按钮的DialogResult设置为none,按钮的DialogResult仍然是Cancel。这里发生了什么? – Rawling 2009-11-20 12:10:49

5

看来,要执行的形式关闭验证。
FormClosing事件对此非常合适。这将使您能够拥有相同的代码来控制关闭与否。
只需将取消属性设置为true以防止关闭。 见FormClosing

+1

这很方便,也许我最终会做。 但是,我真正关心的是,为什么按钮导致表单首先关闭,当我没有告诉它。 – Rawling 2009-11-20 12:04:36

+0

+1这就是我所做的。 – Hath 2009-11-20 12:22:56

1

不是试图在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 
    } 
} 

我在这里处理我接受按钮的代码还,我假设任何事情!= DialogResult.OK是取消,但你可以做什么是舒适的为您服务。