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


①新建一个项目, 程序集名称为: 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​​​​​​​文章来源地址https://uudwc.com/A/XNpjr

原文地址:https://blog.csdn.net/djk8888/article/details/131597868

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年07月07日 17:41
下一篇 2023年07月07日 17:45