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

Panel容器中显示多个窗体并通过按钮实现窗体切换的更多相关文章

  1. C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子

    C#WinForm父级窗体内Panel容器中嵌入子窗体.程序主窗体设计例子 在项目开发中经常遇到父级窗体嵌入子窗体所以写了一个例子程序,顺便大概划分了下界面模块和配色,不足之处还望指点 主窗体窗体采用 ...

  2. 理解 docker 容器中的 uid 和 gid

    默认情况下,容器中的进程以 root 用户权限运行,并且这个 root 用户和宿主机中的 root 是同一个用户.听起来是不是很可怕,因为这就意味着一旦容器中的进程有了适当的机会,它就可以控制宿主机上 ...

  3. C#在splitContainer1控件和panel控件中显示窗体

    现在有两个窗体 Form1 和Form2 Form1中有控件splitContainer1 和panel .控件.我们希望Form2在splitContainer1或者panel控件中显示 1:首先看 ...

  4. C# 鼠标移动Winform窗体内或者panel容器内的控件 显示虚线/实现虚线框来确定位置

    C# 鼠标移动WinForm窗体或者panel容器内的控件 移动虚线/实现虚线框来确定位置 1.用到的方法介绍 今天,根据领导指示指导移动容器内的控件,生成虚线框,使用 ControlPaint.Dr ...

  5. c#在主窗体panel 容器内嵌入另一个窗体(子窗体)的实现

    主窗体:  子窗体: 把子窗体嵌入到主窗体的panel 右侧中: 代码: { public MainForm() { InitializeComponent(); } private void Clo ...

  6. DevExpress中barManager下的toolbar如何在panel中显示

    如题,我的Dev Toolbar需要在一个pannel中显示,并且居于最顶部.可是好像默认情况下toolbar都是在窗体的最顶部的,如何设置才能使其位于一个panel的最顶部呢? 解决方案:经过测试, ...

  7. C#中winform中panel重叠无法显示问题

    C#中winform中panel重叠无法显示问题: 最近开发一个项目有个需求是需要多个模式来回切换的,本来考虑使用多个窗口来实现这个功能,但是这样做浪费资源,而且工作量大,所以想到使用panel控件来 ...

  8. 在一个没有设置宽高的容器中,为什么设置position:absolute后就可以全屏显示了?

    此场景适用于移动端百分比布局,背景全屏显示. 在一个没有设置宽高的容器中设置背景,想要背景全屏显示,设置bcakground-size:100%;后还需设置position:absolut; 原因: ...

  9. 22.Extjs Panel中显示多行工具栏(tbar)

    转自:http://blog.sina.com.cn/s/blog_454fbf740100t0xj.html 在应用程序的制作中,我们经常性的会用到工具栏,在Extjs中Panel中提供了tbar和 ...

  10. winform窗体 控件【MDI 窗体容器】

    MDI :窗体容器 -- 在窗体中放置窗体 属性 IsMdiContainer  : 是否是窗体          -- 只有 Form 有此属性    Form2 f2 = new Form2(); ...

随机推荐

  1. 认识Spring MVC-概念-小demo

    二:SpringMVC 异常码: 405:请求不允许 404:资源不存在 400:参数有问题 500:代码有问题 SpringMvc是Spring FrameWork提供的WEB组件,是目前的主流的实 ...

  2. 了解舵机以及MG996R的控制方法

    了解舵机以及MG996R的控制方法 1.舵机基础知识: 舵机是遥控航空.航天模型控制动作,改变方向的重要组成部件,舵机是一种位置(角度)伺服的驱动器. 舵机主要适用于那些需要角度不断变化并可以保持的控 ...

  3. Openfoam UPstream类探索

    前言 上篇文章我们大体捋顺了Pstream类,但上篇没有讲到的是Pstream类很多东西是从UPstream类继承来的 这次我们大体看一下UPstream类,以避免Pstream类内很多继承来的东西不 ...

  4. HACKNOS: RECONFORCE (V1.1)

    HACKNOS: RECONFORCE (V1.1) 目录 HACKNOS: RECONFORCE (V1.1) 1 信息收集 1.1 端口扫描 1.2 ftp分析 1.3 后台目录扫描 1.2.1 ...

  5. 浅拷贝导致的bug

    目录 深拷贝与浅拷贝区别 hutool BeanUtil.copyProperties 浅拷贝问题重现 实现深拷贝的一些工具 深拷贝与浅拷贝区别 在 Java 中,除了基本数据类型(元类型)之外,还存 ...

  6. 按highcharts中column形式转对象展现格式

    highcharts图表type:column事例的格式是这样的: (不论接口返回什么格式,需要转换成下面这样的): xAxis: { categories: ['一月','二月'], }, seri ...

  7. AirTest

    1.环境 直接安装AirTest IDE 就可以了 2.连接手机 打开开发者模式,允许Usb调试,手机在电脑界面显示出来即可 3.Airtest辅助窗 4.Poco辅助窗 新建一个air文件 在poc ...

  8. ChatGpt聊天API使用

    昨天ChatGpt发布了聊天API,新增了两个模型,目前还是测试阶段 gpt-3.5-turbo 功能强大的GPT-3.5模型,专门针对聊天做了优化 gpt-3.5-turbo-0301 此模型只支持 ...

  9. VSCode 自动编译 typescript 为 javascript

    1.我们默认你已经安装了node.js通过npm安装typescript npm install -g typescript 2.VSCode 里,点击"终端" "新建终 ...

  10. javaSE学习三

    数组 /*数组的基本特点一.其长度是确定的.数组-旦被创建,它的大小就是不可以改变的.二.其元素必须是相同类型,不允许出现混合类型.三.数组中的元素可以是任何数据类型,包括基本类型和引用类型.四.数组 ...