2010-10-12 39 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」。