2011-09-14 36 views
0

我的形式比我可以打開它也通過按下F1,然後單擊此代碼首先我檢查如果窗體已打開或not.if被打開我只是想把它面前。我的問題是它不會帶來前面按F1或單擊ToolStripMenuItem,如果我打開它befor。帶來前面的形式的問題

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    Form2 form2; 
    form2 = new Form2(); 

    if (e.KeyCode.ToString() == "F1" && Application.OpenForms.OfType<Form2>().Count() <= 0) 
    // the user pressed the F1 key 
    form2.Show(); 
    else 
    { 
    form2.TopMost = true; 
    form2.BringToFront(); 
    form2.Focus(); 
    form2.TopMost = false; 
    } 
} 

private void ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Form2 form2; 
    form2 = new Form2(); 
    if (Application.OpenForms.OfType<Form2>().Count() <= 0) 
    form2.Show(); 
    else 
    { 
    form2.TopMost = true; 
    form2.BringToFront(); 
    form2.Focus(); 
    form2.TopMost = false; 
    } 
} 
+0

你忘記在else子句中調用Show()。代碼是非常錯誤的,你不想創建一個新的表單,如果你已經有一個。 –

回答

2

它不起作用,因爲您忘記在else子句中調用form2.Show()。代碼是錯誤的,你不想創建一個Form2的新實例(如果已經存在的話)。此外,Winforms中存在一個錯誤,使得Application.OpenForms失去了對錶單實例的跟蹤。做

最好的辦法是明確跟蹤其FormClosed事件處理函數形式的壽命的,這樣你就不必在以後把它找回來:

Form2 form2; 

    private void showForm2() { 
     if (form2 == null) { 
      form2 = new Form2(); 
      form2.FormClosed += delegate { form2 = null; }; 
     } 
     form2.Show(); 
     form2.Focus(); 
    } 

呼叫showForm2從事件處理程序。

+0

@Hans FormClosed事件良好的調用。您仍然需要添加BringToFront(或其他?),以便將已經打開的form2帶到用戶的背後。 – LarsTech

+0

@Lars - 你是對的,已更新。 Focus()就足夠了,這些窗口屬於同一個線程。好吧,希望。 –

+0

@shiny - 否,當表單不存在時,else子句中的代碼會運行。原始代碼是錯誤的,我建議您在我的代碼段中使用該方法。 –

1

只要打電話form2.Show()BringToFront。你應該聲明`new Form2()'。

private Form2 form2; 

private void ShowForm2() 
{ 
    if (form2 == null) 
    { 
    form2 = new Form2(); 
    form2.FormClosed += delegate { form2 = null; }; 
    } 
    form2.Show(); 
    form2.BringToFront(); 
} 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    ShowForm2(); 
} 

private void ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    ShowForm2(); 
} 

從Hans的代碼中,我添加了委託來處理關閉表單並重新打開它的null問題。

+0

它不工作! – shiny

+0

@shiny我認爲我們越過了。我只是再次更新它。 – LarsTech