C#子窗体嵌入主窗体

上位机开发中,经常会需要将子窗体嵌入到主窗体。

运行结果

核心实现:

        private void button2_Click(object sender, EventArgs e)
        {
            Form3 childForm = new Form3();
            //判断容器中是否已经打开子窗体,如果打开现将其关闭
            foreach (Control item in this.splitContainer1.Panel2.Controls)
            {
                if (item is Form)
                {
                    ((Form)item).Close();
                    Console.WriteLine("找到以前的窗体并关闭");
                }
            }
            childForm.TopLevel = false;//将子窗体设置成非顶级控件
            childForm.FormBorderStyle = FormBorderStyle.None;//如果是带边框的窗体,需要去掉窗体边框;
            childForm.Parent = this.splitContainer1.Panel2;
            childForm.Dock = DockStyle.Fill;//设置随着容器的大小自动调整窗体大小;
            childForm.Show();
        }

代码提炼优化为通用方法

public void OpenForm(Form childForm)//按钮事件调用通用方法
{
    if (childForm == null)
    {
        return;
    }

    //Form2 childForm = new Form2();
    //判断容器中是否已经打开子窗体,如果打开现将其关闭
    foreach (Control item in this.splitContainer1.Panel2.Controls)
    {
        if (item is Form)
        {
            ((Form)item).Close();
            Console.WriteLine("找到以前的窗体并关闭");
        }
    }
    childForm.TopLevel = false;//将子窗体设置成非顶级控件
    childForm.FormBorderStyle = FormBorderStyle.None;//如果是带边框的窗体,需要去掉窗体边框;
    childForm.Parent = this.splitContainer1.Panel2;
    childForm.Dock = DockStyle.Fill;//设置随着容器的大小自动调整窗体大小;
    childForm.Show();
}

调用方法

private void button3_Click(object sender, EventArgs e)
{
    OpenForm(new Form2());
}

 完整

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 childForm = new Form2();
            //判断容器中是否已经打开子窗体,如果打开现将其关闭
            foreach (Control item in this.splitContainer1.Panel2.Controls)
            {
                if (item is Form)
                {
                    ((Form)item).Close();
                    Console.WriteLine("找到以前的窗体并关闭");
                }
            }
            childForm.TopLevel = false;//将子窗体设置成非顶级控件
            childForm.FormBorderStyle = FormBorderStyle.None;//如果是带边框的窗体,需要去掉窗体边框;
            childForm.Parent = this.splitContainer1.Panel2;
            childForm.Dock = DockStyle.Fill;//设置随着容器的大小自动调整窗体大小;
            childForm.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form3 childForm = new Form3();
            //判断容器中是否已经打开子窗体,如果打开现将其关闭
            foreach (Control item in this.splitContainer1.Panel2.Controls)
            {
                if (item is Form)
                {
                    ((Form)item).Close();
                    Console.WriteLine("找到以前的窗体并关闭");
                }
            }
            childForm.TopLevel = false;//将子窗体设置成非顶级控件
            childForm.FormBorderStyle = FormBorderStyle.None;//如果是带边框的窗体,需要去掉窗体边框;
            childForm.Parent = this.splitContainer1.Panel2;
            childForm.Dock = DockStyle.Fill;//设置随着容器的大小自动调整窗体大小;
            childForm.Show();
        }

        
        public void OpenForm(Form childForm)//按钮事件调用通用方法
        {
            if (childForm == null)
            {
                return;
            }

            //Form2 childForm = new Form2();
            //判断容器中是否已经打开子窗体,如果打开现将其关闭
            foreach (Control item in this.splitContainer1.Panel2.Controls)
            {
                if (item is Form)
                {
                    ((Form)item).Close();
                    Console.WriteLine("找到以前的窗体并关闭");
                }
            }
            childForm.TopLevel = false;//将子窗体设置成非顶级控件
            childForm.FormBorderStyle = FormBorderStyle.None;//如果是带边框的窗体,需要去掉窗体边框;
            childForm.Parent = this.splitContainer1.Panel2;
            childForm.Dock = DockStyle.Fill;//设置随着容器的大小自动调整窗体大小;
            childForm.Show();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            OpenForm(new Form2());
        }

        private void button4_Click(object sender, EventArgs e)
        {
            OpenForm(new Form3());
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Form2 fm2 = new Form2();
            OpenForm(fm2);
        }
        
        private void button6_Click(object sender, EventArgs e)
        {
            Form3 fm3 = new Form3();
            OpenForm(fm3);
        }
    }
}

代码下载:

【免费】C#中在主窗体的某个容器中打开子窗体的方法资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/anlog/89363912

参考链接:

C#知识|上位机子窗体嵌入主窗体方法(实例) (qq.com)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzU4MzgyMDEzOA==&mid=2247486750&idx=1&sn=c6eb7c358c4034c03bb9e768aef70413&chksm=fda27b1bcad5f20d15abae895e50b336366bf58fe0a0350126cbaf3409350bac7845407e1bef&mpshare=1&scene=1&srcid=05262aK0RkJdJaBcUxjNEd5Z&sharer_shareinfo=214d0d5572caabea801daa11554170a3&sharer_shareinfo_first=5c9166718e80955786a42b0207e83e1f#rd

C# WinForm:无法访问已释放的对象 - asdyzh - 博客园 (cnblogs.com)icon-default.png?t=N7T8https://www.cnblogs.com/asdyzh/p/9902520.html 

特此记录

anlog

2024年5月27日

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

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

相关文章

磐启PAN2013 2.4GHz无线收发SOC

PAN2013是一款集成了8位MCU和2568bits EEPROM的无线收发SoC芯片。该芯片工作2.400~2.483GHz世界通用ISM频段,且集成射频收发机、频率发生器、晶体振荡器、调制解调器和低功耗MCU等功能模块,并且支持一对多组网和带ACK的通信模式。 用户通过MCU的I/O口向…

虚拟化平台之Proxmox VE 安装

介绍 Proxmox VE是一种基于Debian Linux和KVM的虚拟化平台,也可称之为Proxmox Virtual Environment。 Proxmox VE具有非常友好的用户界面,基于JAVA的UI和内核接口,方便用户登录到VM客户进行操作,还具有易用的模板功能&#xff0…

如果创办Google

本文是一篇演讲稿,来自于《黑客与画家》一书的作者保罗*格雷厄姆,被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲,内容是关于如果他们将来想创立一家创业公司,现在应该做些什么。很多学校认为应该向学生们传授一些有关…

【Leetcode 160】环形链表——双指针,细节讲解

题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

腾讯云COS上传文件出现的问题

1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…

【Qt Creator】跨平台的C++图形用户界面应用程序开发框架---QT

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.互联网的核心岗位以及职…

高斯过程学习笔记

目录 基础知识 例子 推荐 A Visual Exploration of Gaussian Processes (distill.pub) AB - Introduction to Gaussian Processes - Part I (bridg.land) 基础知识 高斯过程回归(Gaussian Process Regression) - 知乎 (zhihu.com) 高斯过程&#x…

【Mac】 CleanMyMac X for mac V4.15.2中文修复版安装教程

软件介绍 CleanMyMac X是一款为Mac设计的优秀软件,旨在帮助用户优化其设备的性能并提供清理和维护功能。以下是 CleanMyMac X的一些主要功能和特点: 1.系统性能优化:软件可以扫描和修复潜在的性能问题,包括无效的登录项、大文件…

【Web】CISCN 2024初赛 题解(全)

目录 Simple_php easycms easycms_revenge ezjava mossfern sanic Simple_php 用php -r进行php代码执行 因为ban了引号,考虑hex2bin,将数字转为字符串 php -r eval(hex2bin(16进制)); 注意下面这段报错,因为加不了引号,开…

[集群聊天服务器]----(十一) 使用Redis实现发布订阅功能

接着上文,[集群聊天服务器]----(十)Nginx的tcp负载均衡配置–附带截图,我们配置nginx,使用了多台服务端来提高单机的并发量,接下来我们回到项目中,思考一下,各个服务端之间怎么进行通信呢? 配置…

滑动窗口-java

主要通过单调队列来解决滑动窗口问题,得到滑动窗口中元素的最大值和最小值。 目录 前言 一、滑动窗口 二、算法思路 1.滑动窗口 2.算法思路 3.代码详解 三、代码如下 1.代码如下 2.读入数据 3.代码运行结果 总结 前言 主要通过单调队列来解决滑动窗口问题&#xff…

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞,这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说,开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…

Docker快速安装SQL Server 2022

说明: 系统:Ubuntu 24.04 LTS 拉取SQL Server Docker镜像 docker pull mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04创建数据目录 sudo mkdir /var/mssql_data sudo chmod 777 /var/mssql_data说明: 权限设置为777&#xff0…

[集群聊天服务器]----(十)Nginx的tcp负载均衡配置--附带截图

接着上文,我们剖析了服务端和客户端的代码,但是单台服务器的并发量是有限的,面对并发量的要求,我们就需要引入Nginx来实现并发量的要求,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。 选择负…

最新php项目加密源码

压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 》 工具 》 修复压缩文件…

JavaSE——集合框架二(2/6)-综合案例-斗地主游戏(做牌、洗牌、发牌、排序、看牌)

目录 需求与分析 具体实现 牌类定义 房间类定义 初步测试 启动游戏 运行案例 需求与分析 需求 总共有54张牌点数:"3","4","5","6","7","8","9","10","J",&qu…

MyBatis的基础操作

目录 一.什么是MyBatis? 二.使用MyBatis的准备工作 1.引入依赖: 2.配置数据库连接字符串(建立MaBatis和MySQL的连接) 3.在model包中建立数据库对应的实体类UserInfo 三.通过注解的方式实现MyBatis的开发 1.插入语句(Insert) 2.删除语句(Delete) 3.更新语句(Update) 4…

驱动开发:内核MDL读写进程内存

100编程书屋_孔夫子旧书网 MDL内存读写是最常用的一种读写模式,通常需要附加到指定进程空间内然后调用内存拷贝得到对端内存中的数据,在调用结束后再将其空间释放掉,通过这种方式实现内存读写操作,此种模式的读写操作也是最推荐使用的相比于CR3切换来说,此方式更稳定并不会…

c语言--结构体

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 结构体概念简介 c语言数组是一些相同类型的数据的集合。 这个结构体就是一些可以是不同类型的集合。 比如描述班里的一个人,他可能需要名字(字符串),也需要年龄(整数)。 这种情况就需要用结构体。 …

【Django】中间件实现钩子函数预处理和后处理,局部装饰视图函数

在app文件夹里新建middleware.py继承MiddlewareMixin, 编写中间件类,重写process_request、process_response钩子函数 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…