C#Parent和Child中的MDI表单

我的项目中有3个表单。

  • form1是MDI控制器
  • form2form3是MDI儿童

如何创建form1作为父级, form2form3作为子级?

像旧的MFC的MDI接口:

在此处输入图像描述

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

首先,确保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引发一个表单容器可以挂钩并实例化Form3的事件来分离Form2和Form3。 此示例代码旨在为您提供方向。

只需告诉表单它的MdiParent是当前的forms。

  form2 frm = new form2 (); frm.MdiParent = this; frm.Show(); 
  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 } 

试试这个function

 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(); }