①新建一个项目, 程序集名称为: 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