【发布时间】:2011-05-20 19:05:08
【问题描述】:
我的项目有 3 个表格。
-
form1是MDI控制器 -
form2和form3是 MDI 孩子
如何将form1 创建为父级并将form2 和form3 创建为子级?
类似于旧 MFC 的 MDI 接口:
想象form2 是父级并且有一个按钮。如果单击,它必须在父窗体 (form1) 中打开 form3。我该如何设置?
【问题讨论】:
我的项目有 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 引发一个事件来解耦 Form2 和 Form3,您的表单容器可以挂接到 Form3 上并实例化 Form3。此示例代码旨在为您指明方向。
【讨论】:
告诉表单它的 MdiParent 是当前表单。
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
}
【讨论】:
试试这个功能
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();
}
【讨论】: