2012-07-16 74 views
0

我有一個窗口形成問題:C#形式閉合

的Program.cs:

Application.Run(new frmStart()); 

frmStart:上btnLoad_Click

frmLoad formLoad = new frmLoad(); 
formLoad.Show(); 
this.Hide(); // if I do a this.Close(); after it shuts down and doesn't get to show the form 

frmLoad:上btnCancel_Click

Application.Exit(); 
// or this.Close(); 
// or even: base.Close(); 

表單消失,但程序沒有結束,我仍然必須按藍色的「停止調試」才能停止。

我一直在尋找......我知道這是可能使程序真正停止,而不是當您關閉第二種形式只是凍結,即使你不保持在屏幕上的第一種形式,但可不記得,也不知道如何。

+1

你試過了Application.ExitThread – HatSoft 2012-07-16 23:14:04

+0

在frmLoad中按下btnCancel時是否要重新打開frmStart或完全關閉應用程序? – craig1231 2012-07-16 23:14:36

+0

@HatSoft:您能否將您的評論置於答案中,我想接受這個答案!謝謝。 – Thalia 2012-07-16 23:18:00

回答

1

確認,-1 Application.ExitThread!

的問題是,你還沒有關閉的主要形式。最簡單的方法是鉤住第二個窗體的Closed事件並關閉主窗體。例如代碼,打開第二個形式更改爲:

 var newForm = new frmLoad(); 
     newForm.FormClosed += (closedSender, closedE) => Close(); 
     newForm.Show(); 
     Hide(); 

這實質上設置,以便當frmLoad窗體關閉,主窗體調用它的close()方法。我爲事件處理程序使用了Lambda表達式,但您可以輕鬆創建一個接受(對象發件人,EventArgs e)並指向.FormClosed的私有方法。

*編輯:對不起,錯過了,你只想要關閉某些狀態。在這種情況下,你的frmLoad,創建一個公共財產,如:

public bool UserCancelled { get; 私人設置; }

其中取消按鈕將其設置爲True在關閉表單之前。在主窗體更改您的事件處理程序:

 var newForm = new frmLoad(); 
     newForm.FormClosed += (closedSender, closedE) => 
           { 
            if (newForm.UserCancelled) 
             Close(); 
           }; 
     newForm.Show(); 
     Hide(); 
+0

我喜歡這個,但是在我使用它之前需要多學習一些......謝謝。 – Thalia 2012-07-16 23:31:47

1

frmStart地址:

public static frmStart Current; 

然後在構造地址:

Current = this; 

然後在frmLoad:上btnCancel_Click

frmStart.Current.Close(); 
1

你真的應該在兩者上都調用Close()。這是唯一的乾淨方式,否則第一種形式永遠不會被告知關閉並且不會清理。

你可能知道它的安全,這樣做,但別人的代碼工作以後可以在第一種形式,他們需要調用的OnClose添加代碼。當他們終於弄清楚爲什麼他們的代碼沒有被調用時,他們會說你不好。

如果關閉這兩個,那麼你的應用程序將退出。

1

我對所有的答案投票呸。在主表單中覆蓋表單關閉並首先關閉輔助表單。