如何用c#在窗体中显示与窗体中的按钮不同的窗体

本文关键字:窗体 按钮 何用 显示 | 更新日期: 2023-09-27 18:14:54

我有两个表单(form1form2)和mdiparent。form1中的button1当点击这个按钮,我想显示form2mdiparent

如何用c#在窗体中显示与窗体中的按钮不同的窗体

当您想要在MDI父类中显示表单时,关键点是:

  • 你应该有一个窗体的属性IsMdiContainer设置为true
  • 您应该显示您的mdi父表单
  • 当你想显示一个窗体作为mdi子窗体时,将子窗体的属性MdiParent设置为mdi父窗体的实例

如果Form1显示为mdi Child,在Form1的按钮点击处理程序中,你可以简单地这样做:

var f = new Form2();
f.MdiParent = this.MdiParent;
f.Show();

else,如果您的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();

如果是主要形式- Program.cs中的Main:

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