C# Winform父窗体打开新的子窗体前,关闭其他子窗体

        随着Winform项目越来越多,界面上显示的窗体越来越多,窗体管理变得更加繁琐。有时候我们要打开新窗体,然后关闭多余的其他窗体,这个时候如果一个一个去关闭就会变得很麻烦,而且可能还会出现遗漏的情况。这篇文章介绍了三种方式实现"Winform父窗体打开新的子窗体前,关闭其他子窗体"的方案。

代码:

   public partial class MainForm : Form
   {
       private UserControl userControl;
       private UserControl1 userControl1;
       private UserControl2 userControl2;

       private Form1 form1;
       private Form2 form2;
       public MainForm()
       {
           InitializeComponent();
           this.IsMdiContainer = true;
           userControl1 = new UserControl1();
           userControl2 = new UserControl2();

           form1 = new Form1();
           form2 = new Form2();
       }



       private void btnForm1_Click(object sender, EventArgs e)
       {
           方法一
           //ShowEmbeddedForm(1);

           方法二
           //form1.MdiParent = this;
           //OpenMdiForm(form1);

           //方法三
           OpenNewChildForm(form1);
       }

       private void btnForm2_Click(object sender, EventArgs e)
       {
           方法一
           //ShowEmbeddedForm(2);

           方法二
           //form2.MdiParent = this;
           //OpenMdiForm(form2);

           //方法三
           OpenNewChildForm(form2);

       }

       /// <summary>
       /// 关闭所有子窗体
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void btnHidden_Click(object sender, EventArgs e)
       {
           panelForm.Controls.Clear();

           // 关闭所有子窗体
           for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
           {
               var openForm = Application.OpenForms[i];
               if(openForm!=this)
               {
                   openForm.Close();
               }
           }
       }

       /// <summary>
       /// 方法一:使用内嵌方式将控件放入到Panel中,放入前清空Panel中的控件
       /// </summary>
       private void ShowEmbeddedForm(int type)
       {
           panelForm.Controls.Clear();
           if (type == 1)
           {
               panelForm.Controls.Add(userControl1);
           }
           else if (type == 2)
           {
               panelForm.Controls.Add(userControl2);
           }
       }

       /// <summary>
       /// 方法二:使用MDI实现父窗体每次只能显示一个子窗体
       /// 特点:子窗体内嵌到父窗体中
       /// </summary>
       /// <param name="子窗体名称"></param>
       private void OpenMdiForm(Form frm)
       {
           //判断是否第一次显示窗体
           if (this.MdiChildren.Length == 1)
           {
               frm.MdiParent = this;
               frm.Show();
               return;
           }
           foreach (Form children in this.MdiChildren)
           {
               if (frm == children)
               {
                   //如果是现在就存在的子窗体就激活它
                   children.Activate();
               }
               else
               {
                   children.Close();
                   if (frm == null || frm.IsDisposed)
                   {
                       Type type = frm.GetType();
                       frm = (Form)System.Activator.CreateInstance(type);
                       frm.MdiParent = this;
                       frm.Show();
                   }
                   else
                   {
                       frm.MdiParent = this;
                       frm.Show();
                   }
               }
           }
       }


       /// <summary>
       /// 方法三:使用OpenForms,在打开新窗体前关闭所有打开的子窗体
       /// </summary>
       /// <param name="newChildForm"></param>
       private void OpenNewChildForm(Form newChildForm)
       {
           // 关闭所有其他的子窗体
           for (int i = Application.OpenForms.Count-1; i >=0; i--) 
           {
               var openForm = Application.OpenForms[i];
               if (openForm != this && openForm != newChildForm)
               {
                   openForm.Close();
               }
           }
           // 打开新的子窗体
           if (newChildForm == null || newChildForm.IsDisposed)
           {
               Type type = newChildForm.GetType();
               newChildForm = (Form)System.Activator.CreateInstance(type);
               newChildForm.Show();
           }
           else
           {
               newChildForm.Show();
           }
       }
   }

实例链接:https://download.csdn.net/download/lvxingzhe3/89249982

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/588171.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HR招聘测评,如何进行人才测评?

说起“人才测评”几个字&#xff0c;相信大家都不会陌生&#xff0c;很多人&#xff0c;尤其是求职者来说&#xff0c;则更加熟悉。在求职应聘中&#xff0c;已经有越来越多的企业开始采用人才测评进行人员选拔。了解人才测评的含义&#xff0c;知道人才测评如何进行&#xff0…

打破失联困境:门店如何利用AI智能名片B2B2C商城小程序重构与消费者的紧密连接?

在如今这个消费者行为日益碎片化的时代&#xff0c;门店经营者们时常感叹&#xff1a;消费者进店如同一场不期而遇的缘分&#xff0c;然而一旦离开门店&#xff0c;就仿佛消失在茫茫人海中&#xff0c;难以再觅其踪迹。这种“进店靠缘分&#xff0c;离店就失联”的困境&#xf…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速在本地运行大模型。通过简单的安装指令&#xff0c;用户可以执行一条命令就在本地运行开源大型语言模型&#xff0c;如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

平面模型上提取凸凹多边形------pcl

平面模型上提取凸凹多边形 pcl::PointCloud<pcl::PointXYZ>::Ptr PclTool::ExtractConvexConcavePolygons(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);p…

政安晨:【Keras机器学习示例演绎】(二十八)—— 使用 卷积神经网络与循环神经网络 架构进行视频分类

目录 数据收集 设置 定义超参数 数据准备 序列模型 推论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正…

Android Handler用法

Android Handler用法 为什么要设计Handler机制&#xff1f;Handler的用法1、创建Handler2、Handler通信2.1 sendMessage 方式2.2 post 方式 Handler常用方法1、延时执行2、周期执行 HandlerThread用法主线程-创建Handler子线程-创建Handler FAQMessage是如何创建主线程中Looper…

微服务保护和分布式事务(Sentinel、Seata)笔记

一、雪崩问题的解决的服务保护技术了解 二、Sentinel 2.1Sentinel入门 1.Sentinel的安装 &#xff08;1&#xff09;下载Sentinel的tar安装包先 &#xff08;2&#xff09;将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;重命名为 sentinel-dashboard.jar &…

Docker容器---Harbor私有仓库部署与管理

一、搭建本地私有仓库 1、下载registry镜像 [rootlocalhost ~]#docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4a2: Pull complete e2ead8259a04: Pull comp…

vulnhub靶场之FunBox-1

一.环境搭建 1.靶场描述 Boot2Root ! This is a reallife szenario, but easy going. You have to enumerate and understand the szenario to get the root-flag in round about 20min. This VM is created/tested with Virtualbox. Maybe it works with vmware. If you n…

NASA数据集——NASA 标准二级(L2)暗目标(DT)气溶胶产品每 6 分钟在全球范围内对陆地和海洋上空的气溶胶光学厚度(AOT)产品

VIIRS/NOAA20 Dark Target Aerosol 6-Min L2 Swath 6 km 简介 NOAA-20&#xff08;前身为联合极地卫星系统-1&#xff08;JPSS-1&#xff09;&#xff09;--可见红外成像辐射计套件&#xff08;VIIRS&#xff09;NASA 标准二级&#xff08;L2&#xff09;暗目标&#xff08;D…

集合的基本操作

集合&#xff1a; 在java当中&#xff0c;含有着一些不同的存储数据的相关集合。分为单列集合&#xff08;Collection&#xff09;和双列集合(Map)。 Collection 首先学习Collection来进行展示&#xff1a; 以框框为例子&#xff0c;蓝色的代表的是接口&#xff0c;而红色的…

【Linux极简教程】常见实用命令不断更新中......

【Linux极简教程】常见实用命令不断更新中...... 常见问题1.Waiting for cache lock: Could not get lock /var/lib/dpkg/lock. It is held by process xxxx(dpkg) 常见问题 1.Waiting for cache lock: Could not get lock /var/lib/dpkg/lock. It is held by process xxxx(dp…

机器学习:基于Sklearn、XGBoost,使用逻辑回归、支持向量机和XGBClassifier预测股票价格

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

C语言——队列的实现

队列按照先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则管理数据。这意味着最先进入队列的元素会被最先移出&#xff0c;类似于排队等候服务的情况。队列通常有两个主要操作&#xff1a;入队&#xff08;enqueue&#xff09;&#xff0c;将元素添加…

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入&#xff0c;30路DA输出的信号处理平台&#xff0c;处理平台采用双DSPFPGA的结构&#xff0c;DSP采用TI公司新一代DSP TMS320C6678&#xff0c;FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

《QT实用小工具·五十》动态增删数据与平滑缩放移动的折线图

1、概述 源码放在文章末尾 该项目实现了带动画、带交互的折线图&#xff0c;包含如下特点&#xff1a; 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点…

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类&#xff0c;它继承了AbstractOwnableSynchronizer&#xff0c;实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

redis缓存详情

redis安装包及图形化软件: 百度链接&#xff1a;https://pan.baidu.com/s/1wljo7JzgrSQyqldv9d5HZA?pwdht1m 提取码&#xff1a;ht1m 目录 1.redis的下载及安装 1.1redis的启动与停止 1.2Redis服务启动与停止 2.redis数据类型及常用指令 2.1redis数据类型 2.2redis常用…

读天才与算法:人脑与AI的数学思维笔记15_声响的数学之旅

1. 音乐 1.1. 巴赫的作品以严格的对位著称&#xff0c;他十分中意对称的结构 1.2. 巴托克的作品很多都以黄金比例为结构基础&#xff0c;他非常喜欢并善于使用斐波纳契数列 1.3. 有时&#xff0c;作曲家是本能地或者不自知地被数学的模式和结构所吸引&#xff0c;而他们并没…

Golang | Leetcode Golang题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …
最新文章