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(); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?