要调用一个已经建好的窗体Form2,窗体名称存在数据库中,我在数据库中查询到我将要打开的窗体是Form2.
如string openForm="Form2";但是如何找开这个窗体呢?

解决方案 »

  1.   

    可以根据反射来做.但你必须知道程序集的名称 和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;
            }
      

  2.   

    [DllImport("User32.dll", EntryPoint = "FindWindow")]
     private static extern int FindWindow(string lpClassName, string lpWindowName);int window_Handler = FindWindow(null, @"Form2");
      

  3.   

    这样可以吗?
    if(openForm=="Form2")
    {
    form2 fm=new form2();
    fm.open();
    }
      

  4.   

    public static object LoadForm(string form2)
    {
       Type type = Type.GetType(reader.GetAttribute("form2"));
       object obj = Activator.CreateInstance(type); // 创建新对象    return obj
    }
      

  5.   

    改个问法吧,我已经把我要打开的窗体名称定义为一个string :
    如:string openForm="Form2";
      不用Form2 fm=new Form2(); 
          Fm.open(); 
      打开窗体,而是得用openForm来打开"Form2"
      我想用Form fm=(Form)openForm;但提示string类型无法转换成System.Windows.Forms.Form
      即要打开的窗体名称是通过openFormp这个变量来传递的
      
      

  6.   

    使用打开窗体方法:
    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
      

  7.   


    用楼上获得的句柄 (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
    }
      

  8.   

    假定条件:
    1、调用窗体可能在不同的程序集、使用不同的命名空间
    2、调用窗体可能会是后期开发如果以上两个条件有一个不满足,都可以使用以下方法:Switch (OpenForm)
    {
        case "Form2"
            Form2 frm=new Form2();
            frm.Show();
            break;
        case ""
            ...
    }如果以上两个条件可能同时存在,就需要通过反射来实现。使用反射方式时,数据库中的数据必须能够提供窗体所在的程序集名称、命名空间、类名,然后使用zgke提供的代码来实现
      

  9.   

    例如:在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();
    }