2012-09-04 85 views
1

我想創建一個簡單的c#應用程序(我的第一次嘗試在c#所以請善待)。我創建了一個帶有文本框的表單來捕獲一個「認證碼」,然後驗證這個認證碼,然後一個webclient獲取一個xml文件,將這個認證碼傳遞給請求。發回的數據被解析爲e.c.t.c#初始化後的第二個窗體關閉

我想要做的是一旦xml​​返回並且我做了檢查以驗證它是否正常。我想關閉第一個窗體並加載第二個窗體,我將以一種漂亮的格式以編程方式添加顯示xml數據所需的窗體組件。

我的問題是,我無法讓第二種形式保持開放(毫無疑問,以錯誤的方式調用第二種形式)。這是我有什麼:

// close current form 
this.Close(); 

//open new form 
xmlViewForm xmlView = new xmlViewForm(); 
xmlView.Show(); 

我敢肯定,你已經發現了現在正在犯的錯誤。但僅僅爲了完整性陳述明顯,它關閉第一種形式,打開第二種形式,然後立即退出程序(第二種形式明顯閃爍一秒鐘)。

我已經嘗試了一些事情,但他們沒有工作,使用Application.Run(new xmlViewForm());(包括替代的實例化類和使用方法show()顯然你知道不工作,現在我做太多,但我不明白C#甚至遠程足以明白爲什麼。

感謝所有幫助:)

回答

5

首先想到的是,你正在通過調用Application.Run(new MyForm())或類似的東西來關閉你打開的表單。這種形式具有特殊意義;它是應用程序的「主要形式」,並且在關閉時,無論有多少個其他窗口打開,它都會嚮應用程序發出信號,告知用戶要關閉整個程序。

有兩種可能的修復方法。首先,最簡單的方法就是隱藏()你不想看到的窗體,而不是調用Close()。雖然看不見,但它仍在運行,所以應用程序不會關閉。

第二種解決方案是定義應該運行的自定義「應用程序上下文」,而不是通過指定要監視的主窗體創建的「默認上下文」。您可以通過從System.Windows.Forms.ApplicationContext派生自定義類來完成此操作。通過指定此上下文,您可以使用它來基於主窗體關閉以外的其他內容來控制應用程序的終止。啓動兩個「主窗體」並記錄兩者是否仍然有效的示例代碼可以在the MSDN page for the class找到。您可以通過爲主窗體指定Load和Close處理程序,然後在主窗體實例化時將它們傳遞給子窗體,從而保留「打開」窗體的計數,並在該數字爲零。通過在this.Close()之前撥打childForm.Show()來確認子表格在關閉主窗體之前加載。

+0

謝謝基思,這正是我需要的。我正要問Sean爲什麼你不能關閉它,如果有一種解決方法(我目前的應用程序可以很好地隱藏它,但我可以想象更大的應用程序需要關閉主窗口來限制資源使用,除非它們使用一個空表格作爲主控制器並立即隱藏)。你的解釋是完美的,我討厭知道如何修理某些東西,但不知道修理工作的原因,不讓我不在哪裏。 – Lee

+0

「主要形式」沒有什麼特別之處。它恰好通常是你入口點方法的最後一行。你可以在你的Application.Run(Form)調用之後運行額外的代碼,這樣說關閉表單'嚮應用程序發出用戶想要關閉整個程序的信號'是誤導性的。 – Mufaka

+0

包括OP在內的六人認爲我是對的。你是唯一一個在我的答案中發現問題的人。多次調用'Application.Run()',或者在一次調用Run()之後調用除清理代碼之外的任何東西都是錯誤的代碼。假設OP沒有遵循你的建議,當主窗體關閉時,消息泵到Windows將被關閉,程序將繼續超出對Run()的調用,通常會立即從主方法返回,如App.Run ()是最後一行。你的回答錯了。像專業一樣處理它,並從中學習而不是報復。 – KeithS

4

您可以關閉主窗體後打開第二個形式。

這樣做:因爲它的父窗體

//open new form 
xmlViewForm xmlView = new xmlViewForm(); 
xmlView.Show(); 

// hide current form 
this.Hide(); 

主要形式不能被關閉。如果關閉主窗體,子窗體將永遠不會顯示。

或編輯Program.cs文件

Application.Run(new XmlViewForm()); 

改變xmlViewForm到主窗體然後你就可以輕鬆地先調用其他形式在裝貨的時間,並將其關閉,請你:

private void XmlViewForm_Load(o, s) 
{ 
    // hide current form, and this will remain hidden until the other form is done with it's work 
    this.Hide(); 

    //open the other form 
    TheOtherForm _theOtherForm = new TheOtherForm(); 
    _theOtherForm.Show(); 

} 

private void TheOtherForm_Closed(o, s) 
{ 
    // show current form 
    this.Show; 

} 
+0

'Hide()'不關閉,只是隱藏表單。 –

+0

爲什麼要關閉主窗體?這是父母的形式。 @RandolfRincón-Fadul –

+0

該OP說:「我想關閉第一個表格」。現在我看到了你的編輯,+1 –