我是一个表格而不是我可以打开它也是通过按F1并在此代码中单击所以我先检查表单是否已打开。如果已打开,我只想把它带到前面。我的问题是,如果我打开它,按F1或单击ToolStripMenuItem不会带来前面的。
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 :(得分: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。
答案 1 :(得分: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问题。