C#Windows窗体切换

时间:2013-05-08 19:19:57

标签: c# windows-forms-designer

我得到Form1,当点击某个按钮时会创建另一个表单:

 private void ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     Form f5 = new Form5();
     f5.Show();
 }

当它发生时,我需要确定这个形式f5是否存在,所以如果它存在,按下按钮时,它只是切换到现有的形式而不是新的形式。如果它不存在,那么它必须创造新的形式。 我如何做到这一点,如果我无法检查是否存在某些对象,直到我声明它们为止? 如何在我声明它之前检查f5存在,所以我只有在没有这种形式且需要时才能创建它?

3 个答案:

答案 0 :(得分:4)

正确这样做的方法是在创建Form5对象时保持对它的引用。例如,您可以通过声明类级变量来执行此操作。

public class MyForm : Form
{
    private Form5 m_frm5 = null;

    // ...other code...

    private void ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (m_frm5 == null)
        {
            m_frm5 = new Form5();
        }
        m_frm5.Show();
    }
}

显然,您需要根据访问表单对象的位置选择适当的范围。 static局部变量也可能同样有效,或者您可能需要将其设置为整个应用程序的全局变量。

或者,您可以遍历Application.OpenForms集合,检查是否已创建Form5的实例。

private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (Form f in Application.OpenForms)
    {
        if (f.GetType() == typeof(Form5))
        {
            f.Show();
            return;
        }
    }

    Form5 frm5 = new Form5();
    frm5.Show();
}

专家提示为表单类选择比默认值更多的描述性名称。 Form5什么也没告诉我。

答案 1 :(得分:1)

Form5创建为私有变量。在创建新的之前,请在创建新的之前检查它是否存在。

 private Form5 form5 = null;

 private void ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if(f5 == null || !f5.Visible)
         f5 = new Form5();

     f5.Show();
 }

答案 2 :(得分:0)

我只是将实例作为父代码的一部分:

Form f5 = null;

private void ToolStripMenuItem_Click(object sender, EventArgs e) { 
if (f5 == null) {
      f5 = new Form5(); 
      f5.Show();
  }
 }

稍后编辑:你是对的,你已经捕获了正确的代码序列:)。我只会打开一次。

如果您的应用程序不是MDI,我宁愿使用ShowDialog()