【发布时间】:2015-09-28 10:17:51
【问题描述】:
我有两种形式( form1 和 form2 )和 mdiparent 。 form1 中的 button1 单击此按钮时,我想在 mdiparent
中显示 form2【问题讨论】:
我有两种形式( form1 和 form2 )和 mdiparent 。 form1 中的 button1 单击此按钮时,我想在 mdiparent
中显示 form2【问题讨论】:
要在 MDI 父级中显示表单时的关键点是:
IsMdiContainer 设置为true 的表单
MdiParent 设置为 mdi 父表单的实例因此,如果您的 Form1 显示为 mdi Child,在您的表单 1 的按钮单击处理程序中,您可以简单地执行以下操作:
var f = new Form2();
f.MdiParent = this.MdiParent;
f.Show();
否则,如果您的 mdi 父窗体已打开但窗体 1 不是 mdi 子窗体:
var f = new Form2();
//I supposed that [mdiparent] is class name of your mdi parent form
f.MdiParent = Application.OpenForms.OfType<mdiparent>().FirstOrDefault();
f.Show();
你应该先显示你的 mdi 父表单,然后使用上面的代码将表单 2 显示为 mdi 子表单。
【讨论】:
您唯一需要做的就是创建一个Form2,将其设置为MdiParent 属性并显示它。唯一的问题是动态设置MdiParent 属性——你需要持有MdiParent 的实例。有几种方法可以“正确”地做到这一点。
在Form1按钮点击应该有以下事件处理程序:
private void Button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.MdiParent = this.MdiParent; // "this" is Form1
form.Show();
}
此解决方案的架构较少 - 但是,如果合适,您可以选择此解决方案。
如果我这样做,我会使用单例模式。我就是这样做的:
MdiParent:
public class MdiParent : Form
{
private static MdiParent _instance;
public static MdiParent Instance
{
get { return _instance ?? (_instance = new MdiParent()); }
}
}
在你实例化你的MdiParent的地方:
MdiParent.Instance.Show();
// instead of
new MdiParent().Show();
如果是主窗体——Main in Program.cs:
Application.Run(MdiParent.Instance);
// instead of
Application.Run(new MdiParent());
Form1按钮点击事件:
private void Button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.MdiParent = MdiParent.Instance;
form2.Show();
}
【讨论】: