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

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

主窗体formMain中有个一Panle;

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

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

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


实现方法如下:

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

      

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

实现方法有两种:

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

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

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

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

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

  1. //第二种方案,先将检查容器内是否有需要打开的窗体,如果有显示,如果没有打开
  2. private void openForm2(Type t, Panel panel)
  3. {
  4. Control[] cArray = panel.Controls.Find(t.Name, false);
  5. if (cArray.Length > 0)
  6. {
  7. //如果容器中要显示的窗体已经存在,将其显示到最前端
  8. Form frm = (Form)cArray[0];
  9. frm.BringToFront();
  10. }
  11. else
  12. {
  13. //如果要显示的窗体不在容器中,新建该窗体并将其显示到最前端
  14. Form newFrm = (Form)Activator.CreateInstance(t);
  15. newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
  16. //f.Parent = p;
  17. panel.Controls.Add(newFrm);//将窗体添加到容器中
  18. newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
  19. newFrm.Dock = DockStyle.Fill;
  20. newFrm.Show();
  21. newFrm.BringToFront();
  22. }
  23. }

项目全部代码如下:

  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace 主窗体嵌入子窗体
  5. {
  6. public partial class frmMain : Form
  7. {
  8. public frmMain()
  9. {
  10. InitializeComponent();
  11. }
  12.  
  13. private void openFrm1_Click(object sender, EventArgs e)
  14. {
  15. openFrom(typeof(frm1), panelMain);
  16. //openForm2(typeof(frm1), panelMain);
  17. }
  18.  
  19. private void openFrm2_Click(object sender, EventArgs e)
  20. {
  21. openFrom(typeof(frm2), panelMain);
  22. //openForm2(typeof(frm2), panelMain);
  23. }
  24.  
  25. //第一种方案,先将容器内的所有窗体关闭,然后再打开需要打开的窗体
  26. private void openFrom(Type t, Panel p)
  27. {
  28. //第一步,先关闭容器内的所有窗体对象
  29. foreach (Control item in p.Controls)
  30. {
  31. if (item is Form)
  32. {
  33. ((Form)item).Close();
  34. }
  35. }
  36. //第二步,新建要显示的窗体对象并显示到容器中
  37. Form newFrm = (Form)Activator.CreateInstance(t);
  38. newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
  39. p.Controls.Add(newFrm);//将窗体添加到容器中
  40. //f.Parent = p;
  41. newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
  42. newFrm.Dock = DockStyle.Fill;
  43. newFrm.Show();
  44. }
  45.  
  46. //第二种方案,先将检查容器内是否有需要打开的窗体,如果有显示,如果没有打开
  47. private void openForm2(Type t, Panel panel)
  48. {
  49. Control[] cArray = panel.Controls.Find(t.Name, false);
  50. if (cArray.Length > 0)
  51. {
  52. //如果容器中要显示的窗体已经存在,将其显示到最前端
  53. Form frm = (Form)cArray[0];
  54. frm.BringToFront();
  55. }
  56. else
  57. {
  58. //如果要显示的窗体不在容器中,新建该窗体并将其显示到最前端
  59. Form newFrm = (Form)Activator.CreateInstance(t);
  60. newFrm.TopLevel = false;//将顶层窗口属性设置为false,否则无法显示到Panel容器中
  61. //f.Parent = p;
  62. panel.Controls.Add(newFrm);//将窗体添加到容器中
  63. newFrm.FormBorderStyle = FormBorderStyle.None;//设置为无边框
  64. newFrm.Dock = DockStyle.Fill;
  65. newFrm.Show();
  66. newFrm.BringToFront();
  67. }
  68. }
  69. }
  70. }

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. Rigol DSA815频谱仪在合肥光源工作点测量系统中的应用

    发的这篇文,我只是搬运工,读者切记. 合肥光源工作点测量系统已实现BBQ无激励在线测量,还是前些年永良师弟在这的时候调试成功的,并和超才把安捷伦的一台频谱仪和普源的DSA815的IOC调试成功,不过在 ...

  2. 3D场景建模零代码平台

    3D场景建模软件(零基础.零代码.**),是指用来制作场景的软件,分为2D建模和3D建模,二者使用的技术及原理不同. 2D软件:它是用3维几何图形绘制出三维图形的软件,其主要功能是利用软件中已经画好的 ...

  3. Vue学习笔记之Vue-Router

    1. 概述 Vue Router 是 Vue.js 的官方路由.它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举.功能包括: 嵌套路由映射 动态路由选择 模块化.基于组件 ...

  4. PostgreSQL 并行计算算法,参数,强制并行度设置

    一.优化器并行计算的并行度计算方法 1.总worker进程数 postgres=# show ; max_worker_processes ---------------------- 128 (1 ...

  5. 【必看】RuoYiVuek框架-数据源动态新增、配置如此简单!

    应用场景 系统用户只能访问系统配置的数据源(可动态新增修改的) RuoYi Vue 框架源码 点我跳转 实现方式 1.系统提供 Yml文件配置 + Druid加载数据源 + @DataSource注解 ...

  6. you-get下载

    you-get下载教程:https://www.jianshu.com/p/254d3b59313f

  7. ftpget

    Usage: ftpget [OPTIONS] HOST [LOCAL_FILE] REMOTE_FILE ftpget -u user -p passwd ip LOCAL_FILE REMOTE_ ...

  8. Oracle 11g 单机服务器ASM部署

    Oracle oracle,相比都有所了解,是一家企业级的数据库公司(收费),上图是oracle官网,也是对外的服务平台 oracle有自己独特的安装方式:ASM   :  自动存储管理(ASM,Au ...

  9. SOJ1737 题解

    题意 给定一个长度为 \(n\) 的串 \(S\). 定义 \(occ(T)\) 表示串 \(T\) 在 \(S\) 中出现的次数. \(q\) 次询问,每次询问给定一个区间 \([l,r]\),查询 ...

  10. 【剑指Offer】【树】二叉树中和为某一值的路径

    题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数 ...