【问题标题】:MDI form in C# Parent And ChildC# Parent 和 Child 中的 MDI 表单
【发布时间】:2011-05-20 19:05:08
【问题描述】:

我的项目有 3 个表格。

  • form1是MDI控制器
  • form2form3 是 MDI 孩子

如何将form1 创建为父级并将form2form3 创建为子级?

类似于旧 MFC 的 MDI 接口:

想象form2 是父级并且有一个按钮。如果单击,它必须在父窗体 (form1) 中打开 form3。我该如何设置?

【问题讨论】:

    标签: c# winforms mdi


    【解决方案1】:

    首先,确保 Form1 的 IsMdiContainer 设置为 true

    然后实例化Form1和Form2,设置Form1为Form2的MdiParent:

    // Form1.IsMdiContainer should be true
    Form1 form1 = new Form1();
    
    // This automatically adds form2 into form1's MdiChildren collection
    Form2 form2 = new Form2();
    form2.MdiParent = form1;
    

    在 Form2 的代码中,有类似下面的东西来处理按钮的点击事件来实例化 Form3。

    public class Form2 : Form {
        // Include as data member so we only instantiate one Form3
        Form3 _form3;
    
        public Form2() {
            InitializeComponent();
            Button1.Click += new EventHandler(Button1_Click);
        }
    
        private void Button1_Click(object sender, EventArgs e) {
            if(_form3 == null) {
                _form3 = new Form3();
                // Set Form3's parent to be Form1
                _form3.MdiParent = this.MdiParent;
            }
        }
    }
    

    作为一对夫妇的笔记,这段代码真的是又快又脏。它有一些不受欢迎的东西,比如 Form2 和 Form3 的耦合(以及无用的类名 Form1、Form2 和 Form3)。理想情况下,您可以通过从 Form2 引发一个事件来解耦 Form2 和 Form3,您的表单容器可以挂接到 Form3 上并实例化 Form3。此示例代码旨在为您指明方向。

    【讨论】:

      【解决方案2】:

      告诉表单它的 MdiParent 是当前表单。

        form2 frm = new form2 ();
          frm.MdiParent = this;
          frm.Show();
      

      【讨论】:

        【解决方案3】:
            private void homeToolStripMenuItem_Click(object sender, EventArgs e)
            {
                frmHome objfrmHome = frmHome.GetChildInstance();
                objfrmHome.MdiParent = this;
                objfrmHome.WindowState = FormWindowState.Maximized;
                objfrmHome.Show();
                objfrmHome.BringToFront();
            }
        

        然后在您正在调用的表单中

            private static frmHome m_SChildform;
            public static frmHome GetChildInstance()
            {
                if (m_SChildform == null) //if not created yet, Create an instance
        
                    m_SChildform = new frmHome();
                return m_SChildform;  //just created or created earlier.Return it
        
            }
        

        【讨论】:

          【解决方案4】:

          试试这个功能

          public void mdiChild(Form mdiParent, Form mdiChild)
              {
                  foreach (Form frm in mdiParent.MdiChildren)
                  {
                      if (frm.Name == mdiChild.Name)
                      {
          
                          frm.Focus();
                          return;
                      }
                  }
          
                  mdiChild.MdiParent = mdiParent;
                  mdiChild.Show();
          
              }
          

          【讨论】:

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