C#Parent和Child中的MDI表单
我的项目中有3个表单。
-
form1
是MDI控制器 -
form2
和form3
是MDI儿童
如何创建form1
作为父级, form2
和form3
作为子级?
像旧的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(); }