Form1中有panel1和panel2,在panel1中显示Form2,通过在Form2中点击按钮,在panel2中显示Form3.

问题:Form1中有panel1和panel2,在panel1中显示Form2,通过在Form2中点击按钮,相应的在panel2中显示Form3。

我在第一步,panel1中显示Form2没有问题,用controls.add()就可以实现。
但是通过panel1中的Forma2中的按钮,想在panel2中显示Form3(panel2的modifile属性已设置为public,方便再Form2中可以访问panel2),可怎么都不行,在panel2中怎么都显示不出来Form3窗体,那位老鸟可以给个思路和办法。谢谢。

我的思路和尝试过的方法 :我在Form2中的按钮事件中,写如下方法:
Form3 fm3 = new Form3();
fm3.TopLevel = false;
fm3.Dock = DockStyle.Fill;
Form1 fm1 = new Form1();
fm1.panel1.Controls.Add(fm3);
fm3.Show();
结果执行的时候,panel2控件中并没有如期显示Form3的窗体。

当然不行!你的 fm1 是在Form2中创建的,并非主窗体的

需要借助委托实现哟。

(更新答案):先看运行效果

img

Form1.cs

namespace WinFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var f2 = new Form2();
            f2.TopLevel = false;
            f2.Dock = DockStyle.Fill;
            f2.LoadForm3 = LoadForm3;
            f2.Show();
            panel1.Controls.Add(f2);
        }

        private void LoadForm3()
        {
            var f3 = new Form3();
            f3.TopLevel = false;
            f3.Dock = DockStyle.Fill;
            f3.Show();
            panel2.Controls.Add(f3);
        }
    }
}

Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsApp2
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public Action LoadForm3;
        private void button1_Click(object sender, EventArgs e)
        {
            LoadForm3?.Invoke();
        }
    }
}