我的项目中有3个表单。
form1
是MDI控制器form2
和form3
是MDI儿童如何创建form1
作为父级,form2
和form3
作为子级?
类似于旧MFC的MDI界面:
想象一下form2
是父母并且有一个按钮。如果点击,则必须在父表单(form3
)中打开form1
。我该如何设置?
答案 0 :(得分:5)
首先,确保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的代码中,使用以下内容来处理按钮的click事件以实例化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。此示例代码旨在为您提供方向。
答案 1 :(得分:4)
告诉表单它的MdiParent是当前的形式。
form2 frm = new form2 ();
frm.MdiParent = this;
frm.Show();
答案 2 :(得分:0)
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
}
答案 3 :(得分:0)
尝试此功能
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();
}