Panel容器中显示多个窗体并通过按钮实现窗体切换

Panel容器中显示多个窗体并通过按钮实现窗体切换

在项目开发中经常会有如下需求:

主窗体formMain中有个一Panle;

在Panel内显示多个窗体,如form1,form2……,分别通过不同按钮显示不同的窗体,如下所示:

按下打开Frm1按钮,显示frm1窗体的内容;

按下打开Frm2按钮,显示frm2窗体的内容;

 

 

 


 

实现方法如下:

首先先创建主窗体frmMain(内置一个Panel,和两个按钮),以及两个子窗体frm1和frm2,如下:

      

 

 

 第二步,通过代码将子窗体显示在主窗体的panelMain中;

实现方法有两种:

第一种方法:panel种每次只显示一个窗体,操作前先将panel容器中所有的窗体闲关闭,然后再将需要显示的窗体显示。

第二种方法:panel中显示多个窗体,每次显示前查询该窗体是否已经存在,如果存在则将其显示到前端,如果没有则创建该窗体并显示到前端。

第一种方法实现的代码如下:

复制代码
        //第一种方案,先将容器内的所有窗体关闭,然后再打开需要打开的窗体
        private void openFrom(Type t, Panel p)
        {
            //第一步,先关闭容器内的所有窗体对象
            foreach (Control item in p.Controls)
            {
                if (item is Form)
                {
                    ((Form)item).Close();
                }
            }
            //第二步,新建要显示的窗体对象并显示到容器中
            Form newFrm = (Form)Activator.CreateInstance(t);
            newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
            p.Controls.Add(newFrm);//将窗体添加到容器中
            //f.Parent = p;
            newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
            newFrm.Dock = DockStyle.Fill;
            newFrm.Show();           
        }
复制代码

 

第二种方法实现的代码如下:

复制代码
        //第二种方案,先将检查容器内是否有需要打开的窗体,如果有显示,如果没有打开
        private void openForm2(Type t, Panel panel)
        {
            Control[] cArray = panel.Controls.Find(t.Name, false);
            if (cArray.Length > 0)
            {
                //如果容器中要显示的窗体已经存在,将其显示到最前端
                Form frm = (Form)cArray[0];
                frm.BringToFront();
            }
            else
            {
                //如果要显示的窗体不在容器中,新建该窗体并将其显示到最前端
                Form newFrm = (Form)Activator.CreateInstance(t);
                newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
                //f.Parent = p;
                panel.Controls.Add(newFrm);//将窗体添加到容器中
                newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
                newFrm.Dock = DockStyle.Fill;
                newFrm.Show();
                newFrm.BringToFront();
            }            
        }
复制代码

 

项目全部代码如下:

复制代码
using System;
using System.Windows.Forms;

namespace 主窗体嵌入子窗体
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void openFrm1_Click(object sender, EventArgs e)
        {
            openFrom(typeof(frm1), panelMain);
            //openForm2(typeof(frm1), panelMain);
        }

        private void openFrm2_Click(object sender, EventArgs e)
        {
            openFrom(typeof(frm2), panelMain);
            //openForm2(typeof(frm2), panelMain);
        }

        //第一种方案,先将容器内的所有窗体关闭,然后再打开需要打开的窗体
        private void openFrom(Type t, Panel p)
        {
            //第一步,先关闭容器内的所有窗体对象
            foreach (Control item in p.Controls)
            {
                if (item is Form)
                {
                    ((Form)item).Close();
                }
            }
            //第二步,新建要显示的窗体对象并显示到容器中
            Form newFrm = (Form)Activator.CreateInstance(t);
            newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
            p.Controls.Add(newFrm);//将窗体添加到容器中
            //f.Parent = p;
            newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
            newFrm.Dock = DockStyle.Fill;
            newFrm.Show();
        }

        //第二种方案,先将检查容器内是否有需要打开的窗体,如果有显示,如果没有打开
        private void openForm2(Type t, Panel panel)
        {
            Control[] cArray = panel.Controls.Find(t.Name, false);
            if (cArray.Length > 0)
            {
                //如果容器中要显示的窗体已经存在,将其显示到最前端
                Form frm = (Form)cArray[0];
                frm.BringToFront();
            }
            else
            {
                //如果要显示的窗体不在容器中,新建该窗体并将其显示到最前端
                Form newFrm = (Form)Activator.CreateInstance(t);
                newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
                //f.Parent = p;
                panel.Controls.Add(newFrm);//将窗体添加到容器中
                newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
                newFrm.Dock = DockStyle.Fill;
                newFrm.Show();
                newFrm.BringToFront();
            }
        }
    }
}
复制代码

 

posted on   hanzq_go  阅读(706)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示