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​​​​​​​

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值