简体   繁体   English

将表格放在前面的问题

[英]a problem with bringing form in front

I a form than I can open it also by pressing F1 and clicking so in this code first I check if the form has been opened or not.if was opened I just want to bring it to front. 我可以通过按F1并单击来打开它,因此首先在此代码中检查是否已打开该表单。如果已打开,我只想将其放在最前面。 my problem is it wont bring in front by pressing F1 or clicking ToolStripMenuItem if i open it befor. 我的问题是,如果我打开它,将无法通过按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;
  }
}

It doesn't work because you forgot to call form2.Show() in the else clause. 这是行不通的,因为您忘记了在else子句中调用form2.Show()。 The code is wrong, you don't want to create a new instance of Form2 if one already exists. 该代码是错误的,如果一个已经存在,则您不想创建一个新的Form2实例。 Also, there's a bug in Winforms that makes Application.OpenForms lose track of form instances. 此外,Winforms中存在一个错误,该错误使Application.OpenForms失去了对表单实例的跟踪。

Best thing to do is to explicitly keep track of the lifetime of the form with its FormClosed event handler so you don't have to find it back later: 最好的办法是使用其FormClosed事件处理程序明确跟踪表单的生命周期,因此您以后不必找回它:

    Form2 form2;

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

Call showForm2 from your event handlers. 从事件处理程序调用showForm2。

Just call form2.Show() and BringToFront . 只需调用form2.Show()BringToFront You should declare the `new Form2()' once though. 不过,您应该一次声明“ 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();
}

From Hans' code, I added the delegate to handle null problem on closing the form and opening it again. 从汉斯的代码中,我添加了委托以处理关闭表单并再次打开表单时的空问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM