要调用一个已经建好的窗体Form2,窗体名称存在数据库中,我在数据库中查询到我将要打开的窗体是Form2.
如string openForm="Form2";但是如何找开这个窗体呢?
如string openForm="Form2";但是如何找开这个窗体呢?
解决方案 »
- WPF:当Text太长的时候,有谁能让TreeView的文字显示,能够自动换行?就是希望有TextWrap的效果。
- xml文件绑到winform上的datagridview控件
- 网页错误信息
- label控件的颜色
- 请问下能不能在listview控件中实现上下标题的功能,
- 想做一个类似于sql server企业管理器新建表功能的datagridview
- 自定义控件图标问题?
- 动态数组
- 请教一下,如何在aspx的页面内连接到FTP的机器上,谢谢!!!
- visual studio安装求解呀
- 在窗体中拖 一个Datagridview控件,添加了三个列,运行后DatagridView中不是自动有一列吗??
- 关于递归问题的
/// <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;
}
private static extern int FindWindow(string lpClassName, string lpWindowName);int window_Handler = FindWindow(null, @"Form2");
if(openForm=="Form2")
{
form2 fm=new form2();
fm.open();
}
{
Type type = Type.GetType(reader.GetAttribute("form2"));
object obj = Activator.CreateInstance(type); // 创建新对象 return obj
}
如:string openForm="Form2";
不用Form2 fm=new Form2();
Fm.open();
打开窗体,而是得用openForm来打开"Form2"
我想用Form fm=(Form)openForm;但提示string类型无法转换成System.Windows.Forms.Form
即要打开的窗体名称是通过openFormp这个变量来传递的
this.OpenDialogWithParm(类路径,参数);打开子窗体接收参数,执行行load事件
private void Form_Load(object sender, EventArgs e)
{
object[] pt = new object[1];
pt = null;
pt = this.ObjectParm as object[];
//ID为上级窗体传的参数
string ID = pt[0].ToString();
}类路径就是可以设为变量,这样就可以动太打开任意FORM
用楼上获得的句柄 (window_Handler)
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, ShowWindowStyles State);ShowWindow (window_hanlder,5);
就可以显示.这是windows里面对ShowWindwoStyles的定义.
public enum ShowWindowStyles : short
{
HIDE = 0,
SHOWNORMAL = 1,
NORMAL = 1,
SHOWMINIMIZED = 2,
SHOWMAXIMIZED = 3,
MAXIMIZE = 3,
SHOWNOACTIVATE = 4,
SHOW = 5,
MINIMIZE = 6,
SHOWMINNOACTIVE = 7,
SHOWNA = 8,
RESTORE = 9,
SHOWDEFAULT = 10,
FORCEMINIMIZE = 11,
MAX = 11
}
1、调用窗体可能在不同的程序集、使用不同的命名空间
2、调用窗体可能会是后期开发如果以上两个条件有一个不满足,都可以使用以下方法:Switch (OpenForm)
{
case "Form2"
Form2 frm=new Form2();
frm.Show();
break;
case ""
...
}如果以上两个条件可能同时存在,就需要通过反射来实现。使用反射方式时,数据库中的数据必须能够提供窗体所在的程序集名称、命名空间、类名,然后使用zgke提供的代码来实现
(注:一般情况下程序集名称和对象命名空间是一样的,但理论上是可以不一样的,所以数据库中两项都要记录)使用时: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();
}