如何动态打开Form窗体
要调用一个已经建好的窗体Form2,窗体名称存在数据库中,我在数据库中查询到我将要打开的窗体是Form2.
如string openForm="Form2";但是如何找开这个窗体呢?
------解决方案--------------------可以根据反射来做.但你必须知道程序集的名称 和Form命名空间
((Form)LoadForm("程序结名","命名空间.Form1")).Show();
/// <summary>
/// 动态加载WINFORM窗体
/// </summary>
/// <param name="p_AssemblyName">程序集名</param>
/// <param name="p_TypeForm">窗体类名 (全路径)</param>
/// <returns>Form实力</returns>
private object LoadForm(string p_AssemblyName, string p_TypeForm)
{
Assembly _Assembly = Assembly.Load(p_AssemblyName);
Type _FormType = _Assembly.GetType(p_TypeForm);
object _LoadForm = _FormType.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
return _LoadForm;
}
------解决方案--------------------假定条件:
1、调用窗体可能在不同的程序集、使用不同的命名空间
2、调用窗体可能会是后期开发
如果以上两个条件有一个不满足,都可以使用以下方法:
Switch (OpenForm)
{
case "Form2"
Form2 frm=new Form2();
frm.Show();
break;
case ""
...
}
如果以上两个条件可能同时存在,就需要通过反射来实现。
使用反射方式时,数据库中的数据必须能够提供窗体所在的程序集名称、命名空间、类名,然后使用zgke提供的代码来实现
------解决方案--------------------例如:在MyCompany.MyClass.Dll中有一个窗体MyCompany.MyClass.MyForm,数据库中该窗体记录为MyCompany.MyClass|MyCompany.MyClass.MyForm
(注:一般情况下程序集名称和对象命名空间是一样的,但理论上是可以不一样的,所以数据库中两项都要记录)
使用时:
string openForm=dr["FormName"].ToString().Trim();
string[] openFormTemp=openForm.Split(new char[]{'|'});
string aName=openFormTemp[1];
string cName=openFormTemp[2];
System.Reflection.Assembly _Assembly = System.Reflection.Assembly.Load(aName);
Type _FormType = _Assembly.GetType(cName,true,true);
object _LoadForm = Activator.CreateInstance(_FormType, null);
Form frm=_LoadForm as Form;
if (frm !=null)
{
frm.Show();
}