2011-02-04 121 views
8

我有2個窗體...當我啓動應用程序時,使用標題欄中的關閉「X」關閉整個應用程序...現在,當我從第一窗體中選擇一個選項時在我的情況下,它是一個按鈕「添加」作爲其電話簿應用程序..它轉到第二種形式,因爲我已經使用1stform.hide()和2ndform.show()...現在當我做「X」從標題欄它並沒有完全關閉,因爲1stform沒有關閉....如何以這樣的方式編程它,整個應用程序應該關閉的任何階段關閉C#窗體應用程序

+0

作者:「在任何階段」你的意思是在任何形式? – 2011-02-04 12:53:17

+0

是的..從任何形式...只有3在我的情況 – 2011-02-04 13:03:15

回答

11

您的第一個表單被設置爲啓動表單。這意味着無論何時關閉,您的整個應用程序都會關閉。相反,您的應用程序不會關閉,直到它關閉。因此,當您隱藏啓動窗體並顯示第二個窗體時,關閉第二個窗體的用戶不會觸發您的應用程序關閉,因爲他們只關閉了輔助的非模態對話框。

我建議更改您的設計,以便啓動窗體也是您的應用程序的主窗口。嘗試解決實際可用的內置功能毫無意義。無論打開其他子窗體,您希望應用程序在主窗體關閉時退出。

但你的情況下的快速和骯髒的解決方案是打電話給Application.Exit。這將關閉所有當前打開的表單並立即退出您的應用程序。正如我上面所說的,我不太推薦這種方法,因爲不得不從每個窗體的FormClosed事件處理函數中調用Application.Exit,這表示在您的設計中某些內容已經嚴重錯誤。

如果單個啓動表單範例無法爲您解決問題,您應該考慮自己動手並在Program.cs源文件中自定義Main方法。請參閱this related question的回答,以獲取關於如何爲您工作的一些想法。

5

你可以做的是使用窗體的FormClosing事件,並添加以下代碼:

Application.Exit(); 

這將停止整個應用程序,並關閉所有窗口。但是,如果後臺線程正在運行,進程本身將會存活。在這種情況下,你可以使用:

Environment.Exit(); 
+0

後臺線程不會停止退出進程,因爲它會自動關閉。您可能指的是前臺線程。 – 2011-02-04 12:50:29

+0

@JoãoAngelo - 我的意思是,如果有多個線程正在運行,只有GUI線程將被關閉,並且應用程序似乎已關閉,但進程仍在進程列表中。感謝您指出:) – 2011-02-04 12:53:51

2

添加Application.Exit每形式的Closing事件

這樣的:

創建關閉事件處理程序第一

private void Form_ClosingEventhandler()(object sender, CancelEventArgs e) 
{ 
     //Perform any processing if required like saving user settings or cleaning resources 
     Application.Exit(); 
} 

然後將其綁定此事件爲您創建的任何表單。

//Where you create new form and show it. 
Form1 frm= new Form1(); 
//set other properties 
frm.Closing += new EventHandler(Form_ClosingEventhandler); 
Form2 frm2= new Form2(); 
//set other properties 
frm2.Closing += new EventHandler(Form_ClosingEventhandler); 
1

當用戶添加電話號碼後,您不希望關閉整個應用程序嗎?你只需要確保你的主窗口再次可見。這樣寫:

private void AddButton_Click(object sender, EventArgs e) { 
     var frm = new AddPhoneNumber(); 
     frm.StartPosition = FormStartPosition.Manual; 
     frm.Location = this.Location; 
     frm.Size = this.Size; // optional 
     frm.FormClosing += delegate { this.Show(); }; 
     frm.Show(); 
     this.Hide(); 
    }