2010-10-12 42 views
6

我有一个按钮单击事件处理程序与下面的伪代码:C#为什么form.Close()不关闭表单?

private void btnSave_Click(object sender, EventArgs e) 
{ 
    if(txt.Text.length == 0) 
    this.Close(); 
    else 
    // Do something else 

    // Some other code... 
} 

这仅仅是一些简单的代码,但问题是,当文本长度为零,我想关闭表单。但不是关闭表单,而是执行部分//一些其他代码。单击事件处理程序完成执行后,表单将关闭。

我知道,当我在this.Close()之后立即输入return时,表格将关闭,但我想知道为什么当您拨打this.Close()时,表格不是直接关闭的。为什么执行事件处理程序的其余部分?

回答

11

事件处理程序的其余部分因为没有离开方法而被执行。它是如此简单。

调用this.Close()不会立即“删除”表单(和当前事件处理程序)。如果没有更多的表单引用,表单将在稍后由垃圾收集器收集。

this.Close()只不过是一个常规的方法调用,除非该方法抛出异常,否则您将停留在当前方法的上下文中。

+0

但直观上,我会除了在调用this.Close()时将窗体关闭,但事实并非如此。感谢您的澄清。 – Martijn 2010-10-12 08:49:31

+0

@Martijn:所以表单保持打开状态并且根本不关闭?你可以显示“其他代码”在做什么吗?或者你可以发布一个简单的示例显示该行为? – 2010-10-12 08:55:11

+0

@ 0x3a:不正确。表单执行事件处理程序中的所有代码,然后关闭表单。你已经回答了我的问题:)我想知道为什么'Close()'不会在调用'Close()'的时候破坏表单。 – Martijn 2010-10-12 08:57:07

3

回答很简单,因为您正在执行当前的方法,因此this.Close()将被排队,直到您明确返回或您当前的方法引发异常。

4

关闭只隐藏窗体;表单仍然存在,并且如果再次显示它,将不会收到另一个Load事件。

要实际从内存中删除它,请使用Dispose()。

+4

不,这是不正确的。 'Form.Close()'将处理表单,即它调用Dispose'方法。 – 2010-10-12 08:46:18

+1

不完全是,如果表单是一个MDI客户端,并且不可见,Close不会处理。或者,如果窗体是一个对话框(ShowDialog调用),它也不会处理。 – vulkanino 2010-10-12 08:49:19

+0

当我使用'Dispose()'而不是'Close()'时,剩下的代码仍然执行。 – Martijn 2010-10-12 08:52:44

2

另一种可能的解决方案是,如果你打开一个新的形式和要关闭当前页面:如果您使用的newForm.ShowDialog()代替newForm.Show()它不currentForm.Close()关闭currentForm直到newForm也被关闭。

+0

当用'this.Close()'关闭窗体时,注意当前窗体是否使用f.ShowDialog()显示;'它会返回'DialogResult .Cancel'。在对话框中(callee),我添加了'this.Close(); this.Dispose(真);'。现在这个对话似乎终于结束了! \ O / – 2014-02-21 15:09:26

0

除非表单是一种模式形式(用.ShowDialog()打开),否则Form.Close()也会处理表单。所以,在这之后的任何情况下,无论别人怎么说,你都不能重新开放它。这种行为有Form.Visible(隐藏/显示表单)。

这里的要点是.Close()不会从它被调用的部分返回,原因有几个。例如,您可以从另一个表单或类或其他任何地方调用SomeForm.Close()。

Close()只是其他方法。如果这是您想要的,您必须显式地从调用Close()的方法返回。

0

调用MessageBox.Show(frmMain,“消息”,“标题”)将窗体“TextDialog”添加到应用程序的Application.OpenForms()窗体集合中,与frmMain Main窗体本身一起。它在关闭该消息框后仍然存在。

发生这种情况时,如果调用OK按钮委托关闭主窗体,调用frmMain.Close()将不起作用,主窗体不会消失,程序也不会终止,因为它通常会在退出确定委托。只有Application.Exit()将关闭所有垃圾信息框“TextDialog”。