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