【问题标题】:Mdi Child forms single instanceMdi Child 形成单个实例
【发布时间】:2013-12-14 23:21:27
【问题描述】:

我正在用 c# 制作一个 MDI Windows 窗体应用程序,我正在尝试让 mdi 子窗体在单个实例中打开。我在一个新项目中的 button_click 事件中使用这个示例代码只是为了测试目的,它在那里工作正常,但是当我在我的主项目中实现这个代码时它什么也不做。我提供的条件与测试项目完全相同,但它不起作用。我就是不明白为什么。

两种表单具有相同的 MDI 父级。 Form1 与 MDI 父级一起加载。

Form1中用于打开Form2的按钮点击事件:

    private void button1_Click(object sender, EventArgs e)
    {
        if (System.Windows.Forms.Application.OpenForms["Form2"] as Form2 == null)
        {
            Form2 F2 = new Form2();
            F2.MdiParent = this.MdiParent;
            F2.Show();
        }
        else 
        {
            Form2 F2 = (Form2)Application.OpenForms["Form2"];
            F2.Focus();
        }
    }

这里有更多信息:

MDI 父级是项目的起始表单。

MDI父级的Form Load如下:

    private void MDI_Load(object sender, EventArgs e)
    {
        Form1 F1 = new Form1();
        F1.MdiParent = this;
        F1.Show();
    }

【问题讨论】:

    标签: c# forms instance mdi


    【解决方案1】:

    尝试在创建时将名称“Form2”专门设置为 F2,f2.name = "Form2"。这就是 OpenForms 集合解决它的方式。

    【讨论】:

    • 这确实起到了作用。非常感谢你的伙伴。但我仍然不明白为什么在某些情况下不需要这样做。表格 2 F2 = 新表格 2(); F2.MdiParent = this.MdiParent; F2.显示(); F2.Name = "Form2";
    【解决方案2】:

    我同意Form 的范围是这里的一个问题。这就是我在主 mdi 表单中打开 Form 的方式:

    public partial class FormMain : Form
    {
        FormTest ftmTest;
    
        ...
    
        void testToolStripMenuItem_Click(object sender, EventArgs e)
        {
    
            if(frmTest == null)
            {
                frmTest = new FormTest();
                frmTest.MdiParent = this;
            }
            frmTest.Show();
            frmTest.BringToFront();
        }
    

    【讨论】:

      【解决方案3】:

      MdiChildren 未添加到 Application.OpenForms 集合中。

      您需要检查 MdiParent 的 MdiChildren() 集合:

          private void button1_Click(object sender, EventArgs e)
          {
              foreach (Form frm in this.MdiParent.MdiChildren)
              {
                  if (frm is Form2)
                  {
                      if (frm.WindowState == FormWindowState.Minimized)
                          frm.WindowState = FormWindowState.Normal;
                      frm.Focus();
                      return;
                  }
              }
              Form2 F2 = new Form2();
              F2.MdiParent = this.MdiParent;
              F2.Show();
          }
      

      【讨论】:

        【解决方案4】:
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (Form frm in this.MdiChildren)
            {
                if (frm is Form2)
                {
                    if (frm.WindowState == FormWindowState.Minimized)
                        frm.WindowState = FormWindowState.Normal;
                    frm.Focus();
                    return;
                }
            }
            Form2 F2 = new Form2();
            F2.MdiParent = this;
            F2.Show();
        }
        

        【讨论】:

          【解决方案5】:

          我的解决方案

          代码:

          View.FormV view = Application.OpenForms["FormV"] as View.FormV ;
                  if(view == null)
                  {
                      View.FormV View = new FormV();
                      View.MdiParent = this;
                      View.Show();
                  }
                  else
                  {
                      view.Focus();
                  }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多