首页 > 其他分享 >Panel容器中显示多个窗体并通过按钮实现窗体切换

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

时间:2023-01-06 21:34:21浏览次数:31  
标签:容器 显示 Form 窗体 newFrm 按钮 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();
            }
        }
    }
}

 

标签:容器,显示,Form,窗体,newFrm,按钮,Panel
From: https://www.cnblogs.com/hanzq/p/17031620.html

相关文章

  • EAS客户端隐藏菜单栏下的按钮
    在界面加载中的前置或者后置脚本添加pluginCtx.getKDMenuItem("menuItemAppointAssure").setVisible(false);其中KDMenuItem为控件类型,menuItemAppointAssure为控件名,fal......
  • 25、商品服务--三级分类--树形三级分类添加append和delete按钮
    效果如下:我们设置了只有当分类的层级为1或者2时才能显示append按钮,只有当没有子孩子节点时才能显示delete按钮:expand-on-click-node="false"表示只有当点击最......
  • ExtJS - UI组件 - TabPanel
    ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html转载请注明出处:https://www.cnblogs.com/cqpanda/p/16587500.html更新记录2023年1月2日从笔记迁移到......
  • C# Windows 窗体的.Net 框架绘图技术
     当编写一个典型的Windows窗体​​程序​​时,窗体和控件的绘制、效果等操作是不需要特别加以考虑的。这是为什么呢?因为通过使用​​.Net​​本文针对那些Windows窗......
  • ExtJS-UI组件-TreePanel
    ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html转载请注明出处:https://www.cnblogs.com/cqpanda/p/16587500.html更新记录2023年1月2日从笔记迁移到......
  • delphi 窗体引用Frame,操作Frame时产生参数类型不识别的问题
    窗体A引用了含有cxgrid控件的Frame.在frame里面写cxgrid的单元格双击事件时,一点问题都没有.但是如果想在窗体A里面去写Frame中cxgrid单元格的双击事件时,就会出现参数类......
  • 窗体登录逻辑的实现
    winform项目中通常需要登录窗体来打开主窗体的功能,实现逻辑如下:程序启动→打开登录窗体→按下登录按钮→关闭登录窗体→打开主窗体。实现代码如下:Program.cs中代码:sta......
  • react 做一个点赞按钮组件
      创建组件Like.js一开始设置为黑色false,isLiked如果为true渲染红心,false渲染黑心setState时用了两种方法importReact,{Component}from'react'exportdefaultclass......
  • 实现可移动悬浮按钮(微信小程序/H5移动端html)
    微信小程序实现方案:我们可以利用微信小程序的内置组件轻松实现!1.将整个屏幕用movable-area组件覆盖,2.在movable-area内部添加一个movable-view实现自由滑动。3.重点:CSS属......
  • MixGo CE与带灯按钮块
    MixGoCE主控板可以外接按钮模块吗?MixGoCE配套的带灯按钮块怎么使用呢?typec接口的管脚怎么设置呢?……带灯按钮块带灯按钮块可以实现两个功能:按钮和灯使用按钮功......