簡體   English   中英

C# 為什么 form.Close() 不關閉表單?

[英]C# Why does form.Close() not close the form?

我有一個帶有以下偽代碼的按鈕單擊事件處理程序:

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

  // Some other code...
}

這只是一些簡單的代碼,但重點是,當文本長度為零時,我想關閉表單。 但是代碼沒有關閉表單,而是執行部分 // 一些其他代碼。 在單擊事件處理程序完全執行后,表單將關閉。

我知道,當我在this.Close()之后this.Close() return時,表單將關閉,但我想知道為什么當您調用this.Close()時表單不會直接關閉。 為什么執行其余的事件處理程序?

事件處理程序的其余部分被執行,因為您沒有離開該方法。 就是這么簡單。

調用this.Close()不會立即“刪除”表單(和當前事件處理程序)。 如果沒有更多對表單的引用,垃圾收集器稍后將收集該表單。

this.Close()只不過是一個常規的方法調用,除非該方法拋出異常,否則您將停留在當前方法的上下文中。

關閉僅隱藏表單; 表單仍然存在,如果您再次顯示它,將不會收到另一個 Load 事件。

要真正從內存中刪除它,請使用 Dispose()。

答案很簡單,因為您正在執行當前的方法,因此 this.Close() 將被排入隊列,直到您明確返回或當前的執行方法拋出異常為止。

另一種可能的解決方案是,如果您打開一個新表單並想要關閉當前表單:如果您使用newForm.ShowDialog()而不是newForm.Show()它不會使用currentForm.Close()關閉 currentForm 直到 newForm也關門了。

除非 Form 是模態表單(用 .ShowDialog() 打開),否則 Form.Close() 也會處理該表單。 因此,無論其他人怎么說,您在此之后的任何情況下都無法重新打開它。 此行為有 Form.Visible(隱藏/顯示表單)。

這里的重點是 .Close() 不會從它被調用的部分返回,原因有幾個。 例如,您可以從另一個表單或類或其他任何形式調用 SomeForm.Close()。

Close() 只是一種與其他方法一樣的方法。 如果這是您想要的,您必須從調用 Close() 的方法顯式返回。

調用 MessageBox.Show(frmMain,"a message","a title") 將表單“TextDialog”添加到應用程序的 Application.OpenForms() 表單集合中,以及 frmMain Main 表單本身。 關閉消息框后它仍然存在。

當發生這種情況並且您調用 OK 按鈕委托關閉主窗體時,調用 frmMain.Close() 將不起作用,主窗體不會消失並且程序不會像通常在退出 OK 委托后那樣終止。 只有 Application.Exit() 將關閉所有垃圾消息框“TextDialog”。

private void btnCloseForm_Click(object sender, EventArgs e)
{
FirstFrm.ActiveForm.Close();
}

如果您想關閉第一個表單並打開第二個表單,請執行以下操作:

private void btnCloseForm_Click(object sender, EventArgs e)
{
FirstFrm.ActiveForm.Close();
}

private void FirstFrm_FormClosed(object sender, FormClosedEventArgs e)
{
SecounfFrm frm = new SecounfFrm ();
frm.ShowDialog();
}

或者你可以這樣做:

private void btnCloseForm_Click(object sender, EventArgs e)
{
this.Hide();
}

private void FirstFrm_VisibleChanged(object sender, EventArgs e)
{
if(this.Visible == false)
{
this.Close();
}
}

private void FirstFrm_FormClosed(object sender, FormClosedEventArgs e)
{
SecounfFrm frm = new SecounfFrm ();
frm.ShowDialog();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM