2013-06-25 40 views
1

我已經查看了所有建議的答案,沒有任何東西看起來符合我的要求。我想從主表單中調用第二個表單,在第二個表單處於活動狀態時隱藏主表單,然後在第二個表單關閉時取消隱藏主表單。基本上我想在這兩種形式之間「切換」。隱藏表單,切換到第二個表單,關閉第二個表單並取消隱藏第一個表單

到目前爲止,我有:

在我的主要形式有:

private void countClick(object sender, EventArgs e) 
{ 
    this.Hide(); 
    subForm myNewForm = new subForm(); 
    myNewForm.ShowDialog(); 
} 

,並在我的第二個形式,我有:

private void totalClick(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

我如何獲得的主要形式展現?

回答

0

如果您在同一個命名空間的工作,你的背景下,使用mainform或者你給了「主要形式」的名稱,請嘗試:

mainform.show(); 
+1

什麼是'mainform'?它在哪裏定義?應該在哪裏插入?請提供更多背景。 – Chris

0

你需要找到某種方式來傳遞引用以主窗體爲第二窗體單擊事件處理程序。

您可以通過將窗體設置爲第二個窗體類的成員變量或通過事件參數傳遞窗體來完成此操作。

2

ShowDialog將您的二級窗體打開爲模態對話框,這意味着MainForm的代碼執行將在該點停止並且您的二級窗體將具有焦點。所以你所需要做的就是在你的ShowDialog調用後輸入this.Show

從上面的鏈接:

您可以使用此方法在應用程序中顯示一個模式對話框。當調用此方法時,直到關閉對話框之後,它後面的代碼纔會執行​​。

private void countClick(object sender, EventArgs e) 
{ 
    this.Hide(); 
    subForm myNewForm = new subForm(); 
    myNewForm.ShowDialog(); 
    this.Show(); 
} 
+0

我只會添加一個警告......如果當前窗體也是模態對話框,並將其隱藏起來......這不會消除模式嗎?如果是這樣,我只是建議保留窗口的頂部或左側位置,將其設置爲-2000之類的值,然後在另一個窗體關閉時將其設置回來。 – DRapp

+0

@DRapp自從他提到他從他的MainForm中調用最有可能在我心目中將是他的程序的主要形式。所以你描述的情況是不太可能的。另外運行一個快速測試從輔助窗體生成另一個模態對話框並沒有打破Modality。 –

+0

如果一個模式對話框不是你想要的,你總是可以調用myNewForm.Show(this),然後引用表單作爲父母,你可以調用show/hide – Mataniko

1

讓我們在Form1說你點擊一個按鈕,顯示Form2

Form2 frm2 = new Form2(); 
frm2.Activated += new EventHandler(frm2_Activated); // Handler when the form is activated 
frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed); // Hander when the form is closed 
frm2.Show(); 

現在,這一個或者是當顯示Form2Activated隱藏主叫形式,在這種情況下, Form1

private void frm2_Activated(object sender, EventArgs e) 
    { 
     this.Hide(); // Hides Form1 but it is till in Memory 
    } 

然後當Form2Closed它會UnhideForm1

private void frm2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     this.Show(); // Unhide Form1 
    } 
1

這很難做到正確。問題在於,你必須避免沒有窗口才能獲得焦點。 Windows窗口管理器將被迫找到另一個窗口來重點關注。這將是另一個應用程序的窗口。你的窗戶將消失在它後面。

在您現有的代碼片段中已經是這種情況,您在顯示對話框之前隱藏了主窗口。那通常結果沒關係,除非對話創建緩慢。當對話框關閉時它肯定會發生。

所以你需要做的是隱藏你的窗口後您顯示的對話框,並再次顯示它之前對話框關閉。這需要技巧。他們是這樣的:

private void countClick(object sender, EventArgs e) 
{ 
    this.BeginInvoke(new Action(() => this.Hide())); 
    using (var dlg = new subForm()) { 
     dlg.FormClosing += (s, fcea) => { if (!fcea.Cancel) this.Show(); }; 
     if (dlg.ShowDialog() == DialogResult.OK) { 
      // etc... 
     } 
    } 
} 

的的BeginInvoke()調用是一招讓代碼調用ShowDialog()方法運行之後運行。從而確保您的窗口在顯示對話窗口後隱藏。對話框的FormClosing事件用於在對話框關閉之前讓窗口再次可見。

相關問題