winfrom 利用反射 加载窗体(单例)

news2024/9/19 7:31:56

①新建一个项目, 程序集名称为: AssemblyForm  (下面要用到的)

②新建一个Form窗体,窗体名称为: Form1 (下面也要用到),  Form1里的代码:

using System;
using System.Windows.Forms;

namespace AssemblyForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string AssemblyName = "AssemblyForm";//程序集,
            string path = "AssemblyForm.Form2";//命名空间.类
            ReflectionHelper.CreateForm(AssemblyName, path);
        }
    }
}

参数 AssemblyName , 就是程序集名称, 如: "AssemblyForm"
参数 path , 就是 命名空间. , 如:  "AssemblyForm.Form2" , 中间有 . 句号间隔

用以上两个参数, 用于来找到对应的 From窗体的文件, 来反射生成窗体

适用于动态弹出(打开)指定的From, 先业务里做判断, 然后打开指定的  命名空间.的窗体

ReflectionHelper 帮助类:

using System.Reflection;
using System.Windows.Forms;

/// <summary>
/// 反射操作打开子窗体
/// </summary>
public class ReflectionHelper
{
    /// <summary>
    /// 打开新的子窗体
    /// </summary>
    /// <param name="AssemblyName">程序集:  AssemblyForm</param>
    /// <param name="typeName">命名空间.类:   AssemblyForm.Form2</param>
    public static void CreateForm(string assemblyString, string typeName)
    {
        Form newFrm = Assembly.Load(assemblyString).CreateInstance(typeName) as Form;
        if (!ShowChildForm(typeName, newFrm))
        {
            newFrm.ShowDialog();
        }
    }
    /// <summary>
    /// 防止子窗体再度打开
    /// </summary>
    /// <param name="p_ChildrenFormText"></param>
    /// <param name="MdiParentForm"></param>
    /// <returns></returns>
    public static bool ShowChildForm(string path, Form newFrm)
    {
        int i;
        //依次检测当前窗体的子窗体
        for (i = 0; i < newFrm.MdiChildren.Length; i++)
        {
            //判断当前子窗体的Text属性值是否与传入的字符串值相同
            if (newFrm.MdiChildren[i].Name == path)
            {
                //如果值相同则表示此子窗体为想要调用的子窗体,激活此子窗体并返回true值
                newFrm.MdiChildren[i].Activate();
                return true;
            }
        }
        //如果没有相同的值则表示要调用的子窗体还没有被打开,返回false值
        return false;
    }
}

效果:


拓展: 在 tablePage控件里, 不同的table里 动态加载不同的 From

在 tablePage 的 Tag 属性里, 添加上文所说的: 命名空间. 字符串, 下面要用到

该Form3的代码:

using System;
using System.Reflection;
using System.Windows.Forms;

namespace AssemblyForm
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        //加载第一个tablePage的From
        private void Form3_Load(object sender, EventArgs e)
        {
            string formClass = this.tabPage1.Tag.ToString();//namespace.Form的className
            GenerateForm(formClass, tabControl1);
        }
        public int[] s = { 0, 0 };//用来记录窗体是否打开过
        //切换tablePage
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (s[tabControl1.SelectedIndex] == 0)
            {
                string formClass = ((TabControl)sender).SelectedTab.Tag.ToString();
                GenerateForm(formClass, sender);
            }
        }
        //把From反射到tablePage的Panel里
        public void GenerateForm(string form, object sender)
        {
            //反射生成窗体
            Form fm = (Form)Assembly.GetExecutingAssembly().CreateInstance(form);
            //设置窗体没有边框,加入到选项卡中
            fm.FormBorderStyle = FormBorderStyle.None;
            fm.TopLevel = false;
            fm.Parent = ((TabControl)sender).SelectedTab;
            fm.ControlBox = false;
            fm.Dock = DockStyle.Fill;
            fm.Show();
            s[((TabControl)sender).SelectedIndex] = 1;
        }


    }
}

效果:


本文源码下载:  http://download.csdn.net/download/djk8888/88014571​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web-html的基本用法

web前端代码基本用法 <html> <head><meta charset"utf-8"><!-- charset 属性规定 HTML 文档的字符编码。要是没有规定字符编码的话是有可能乱码的 -->待到秋来九月八&#xff08;head&#xff09;<!-- 头部就是直接写在最上面的文字&…

Css:高级技巧

1.精灵图使用 用ps的切片功能测量图片大小和位置 2.字体图标 3.CSS三角形 4.元素显示隐藏 5.鼠标样式 6.输入框input 轮廓线 7.防止文本域拖拽 8 vertical-align实现行内块和文字垂直居中对齐 9.单行文字溢出省略号显示 10.多行文字溢出省略号显示 11.布局技巧 1.相对定位会压…

实战|如何在Linux 系统上免费托管网站

动动发财的小手&#xff0c;点个赞吧&#xff01; Web 服务器可用于指代硬件和软件&#xff0c;或者两者一起工作。出于本指南的目的&#xff0c;我们将重点关注软件方面&#xff0c;并了解如何在 Linux 机器上托管网站。 Web 服务器是一种通过 HTTP/HTTPS 协议接收并响应客户端…

【算法集训之线性表篇】Day 03

文章目录 题目一思路分析代码实现效果 题目一 从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素&#xff0c;若s或t不合理或者线性表为空&#xff0c;则显示错误信息并退出运行。 思路分析 首先&#xff0c;题目给出数据结构为有序顺序表&#xff0c;故要查找…

B站创建视频分集播放列表

上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1、打开B站 2、登录B站后&#xff0c;点击投稿上传视频。 3、上传视频或把视频直接拖拽到页面里&#xff1b; 4、点击上传第一个视频后页面下会出现一个号的按钮&#xff0c;点击继续上传 &#xff0c;上传视频就…

【Python】Selenium操作cookie实现免登录

文章目录 一、查看浏览器cookie二、获取cookie基本操作三、获取cookie并实现免登录四、封装成函数 一、查看浏览器cookie cookie、session、token的区别&#xff1a; cookie存储在浏览器本地客户端&#xff0c;发送的请求携带cookie时可以实现登录操作。session存放在服务器。…

MybatisPlus逆向生成实体类等

面试中遇到的一道机操题&#xff0c;so simple。 这是里SpringBoot项目&#xff0c;注意你的数据表中只有一个id字段是会生成失败的&#xff01; 添加maven依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter…

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记

UPCGBlueprintElement是PCGGraph中自定义节点的基类&#xff0c;但官方目前还没有给出详细的文档&#xff0c;所以从源代码里找点答案。 文章目录 可覆盖函数&#xff08;Override Functions&#xff09;Excute 和 Excute with ContextLoop Body函数和Loop函数Point Loop Body和…

SpringBoot+ Vue 家乡美食系统

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

[期末网页作业]-精仿华为官网10个网页(html+css+js)

经过漫长的期末考试季节&#xff0c;我成功地完成了一个华为官网的仿写项目&#xff0c;并且非常高兴地与大家分享。这个项目包含了10个页面&#xff0c;每一个页面都经过了精心的设计和努力的填充。 首先&#xff0c;我注重了页面的整体布局与设计。借鉴了华为官网的风格&…

Unity3d-UGUI实现的贪食蛇小游戏

按鼠标WASD键来控制蛇的走向。 核心的代码如下&#xff1a; using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI;/// 《UGUI贪吃蛇》public class TCS2d : MonoBehaviour {public bool isOver false;public bool isStop…

【Docker 部署Minio】

Docker 部署Minio 一、拉取Minio镜像二、配置1、创建如下目录2、创建容器并运行 三、访问 一、拉取Minio镜像 访问Docker Hub镜像站找到自己需要的Minio镜像 运行以下命令 sudo docker pull minio/minio二、配置 1、创建如下目录 mkdir -p /home/zx/minio/config mkdir -p…

Java设计模式之一:建造者模式

目录 一、什么是建造者模式 二、建造者模式如何使用 三、建造者模式的优势和应用场景 一、什么是建造者模式 Java建造者模式是一种创建对象的设计模式&#xff0c;它通过将对象的构造过程分离出来&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式适用于创建复…

在前端页面正确展示后端返回的验证码图片

前言&#xff1a; 在开发登录界面时&#xff0c;通过接口请求验证码&#xff1b;后端给返回的格式是Blob&#xff0c;直接用src引用没办法显示。 在控制台输入结果是&#xff1a; 第一想法就是通过 window.URL.createObjectURL(new Blob([res.data],{type:image/png}))转换成u…

【底部消息红点提示】uniapp开发小程序时,使用uni.setTabBarBadge设置底部菜单的红点

一、实现的效果 功能描述&#xff1a;无论点击底部的哪个菜单栏&#xff0c;都可以看到第二个菜单栏下显示的红点通知。 如果只在人脉当前页面设置的话&#xff0c;当你在第二个菜单栏的页面中调用uni.setTabBarBadge方法设置红点后&#xff0c;切换到第一个菜单栏的页面时&am…

力扣 332. 重新安排行程

题目来源&#xff1a;https://leetcode.cn/problems/reconstruct-itinerary/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 这道题目有几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环。解决&am…

【论文基本功】【LaTeX】附录【IEEE论文】

注意&#xff1a;本博客使用的所有命令都需要以使用 IEEEtran 文档类为前提&#xff0c;即 tex 文件的第一行中的必须是 \documentclass[可选参数]{IEEEtran}&#xff08;可选参数部分可以自由选择&#xff0c;如 \documentclass[10pt,journal,compsoc]{IEEEtran}。&#xff09…

C++primer(第五版)第十三章(拷贝控制)

一个类通过定义五种特殊的成员函数来控制这些操作: 拷贝构造函数 拷贝赋值运算符 移动构造函数 移动赋值运算符 析构函数 13.1拷贝,赋值与销毁 13.1.1拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用(必须是引用类型!),并且没有其他参数或是其他参数都有默认值(即…

基于matlab检测使用校准的立体摄像头拍摄的视频中的人物并确定其与摄像头的距离(附源码)

一、前言 此示例演示如何检测使用校准的立体摄像头拍摄的视频中的人物&#xff0c;并确定他们与摄像头的距离。 二、加载立体摄像机的参数 加载对象&#xff0c;这是使用应用程序或函数校准相机的结果。 三、创建视频文件阅读器和视频播放器 创建用于读取和显示视频的系统对…

LabVIEW开发X射线图像增强

LabVIEW开发X射线图像增强 X射线图像在临床诊断中起着重要作用。但是&#xff0c;由于各种原因&#xff0c;例如不均匀&#xff0c;低照度条件和一些噪点&#xff0c;图像质量通常不是很好。因此有必要增强这些图像&#xff0c;以方便后续处理或诊断。模糊集论是开发图像处理中…