2012-06-29 30 views
-1

我有一個主窗體。我想從它啓動另一個窗體並從啓動窗體啓動另一個窗體。我想確保主窗體不可編輯時子窗體是顯示,所以我使用showdialog()更好的方式來顯示形式一個在另一個之上

的MainForm>(ShowDialog的)> Form1中>(+的ShowDialog處置)>窗口2(處置)>的MainForm

從我的MainForm調用form2.ShowDialog(),然後從窗口2我使用以下代碼啓動另一種形式

this.visible=false; 
form3.showdialog(); 
this.dispose(); 

但是這裏有一些問題。是否有更好的方法來實現我在尋找什麼?

edit:more description 

我有一個主要的形式,用戶點擊的MainForm> Form1中的按鈕時lauched>用戶點擊一個按鈕在Form1中>表單2 lauched(diposing /隱藏form1的)窗口2關閉後的MainForm應提請然後所有其他形式應該位於Mainform之上,Mainform應該是不可編輯的

+5

什麼是您所遇到的具體問題? – Josh

+0

從您所描述的內容(生成子表單以至於用戶無法編輯父表單),ShowDialog()完全符合您的需求,並且是實現您所期望的最簡單和最好的方法對於。您需要更具體地瞭解您遇到的任何進一步幫助的問題。我懷疑這些問題不是特定於ShowDialog()調用。 –

+0

@Josh顯示Form2時,主窗體是可編輯的,在某些情況下,Form2會在Mainform後面,我必須從任務欄圖標手動將其置頂。 – techno

回答

2

問題是,您必須指定MainForm作爲(都)form2和form3的父級。當您使用不帶參數的ShowDialog的重載時,WinForms使用活動窗體作爲父窗體,因此form3的父窗口自動變爲窗體2。然後你試圖關閉/處理form2,導致form3成爲孤兒。

有用於獲取參考MainForm的幾個選項,但最簡單的方法是使用:

form2/3.ShowDialog(Application.OpenForms["MainForm"]); 

假設您已經設置了Name屬性上的MainForm爲「MainForm的」。

+0

Thanks.I will tr​​y it – techno

+0

因此,當我從Form2打開後關閉Form3時,控件將返回到Mainform.Should我使用Dispose()或close()。請舉例 – techno

+1

@techno問題是無意義的。由於用戶無法與其他任何東西進行交互,因此模式對話框(表單)會自行關閉。你可以通過設置DialogResult屬性來關閉它。這通常通過設置各種按鈕的DialogResult屬性來完成,通常是將Ok按鈕設置爲DialogResult.Ok並將取消按鈕設置爲DialogResult.Cancel。我想我們需要更多關於你想要完成的事情的信息。 – Tergiver

0

在您的代碼中,僅當form3關閉後才執行this.dispose()。我想你想要的是在form3關閉後關閉form2,所以你可以調用this.Close()而不是this.Dispose()。

this.visible=false; 
form3.showdialog(); 
this.Close(); 

或者,也許,在form3之後,你不再需要form2了。那測量:

this.visible=false; 
//show instead of showdialog so it wont wait until form3 is closed 
form3.show(); 
this.Close(); 
0

它看起來像你試圖實現像嚮導一樣。最好的解決方案是以主要形式依次發佈所有兒童形式。

如果您需要沿着序列傳遞數據,您應該將其從每個對話框傳遞到主窗體,然後將其傳遞到下一個對話框。

+0

如果@techno試圖創建嚮導是真的,最好的方法是使用UserControls作爲「頁面」,並隨着用戶進展將它們交換爲表單和表單。 – Tergiver

0

的MainForm:

Form1 f = new Form1(); 
if (f.ShowDialog(this) == DialogResult.OK) { 
    Form2 f2 = new Form2(); 
    f2.ShowDialog(this); 
} 

Form1中(按一下按鈕,將打開窗體2):

button1_click(object sender, EvengArgs e) { 
    this.DialogResult = DialogResult.OK; 
    Close(); 
} 
相關問題