将形式放在前面的问题

时间:2011-09-14 16:56:28

标签: c# winforms

我是一个表格而不是我可以打开它也是通过按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;
  }
}

2 个答案:

答案 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问题。