所有打开的窗体都存在于Application.OpenForms集合,遍历获取或者判断

解决方案 »

  1.   

    版主指的是激活这个吧,这个我没有问题了,已经实现了,现在的问题是在通过传递窗体类型给函数进行打开,这样我就可以在每个打开新窗体的过程中只用简单的一句openForms(form_a,FrmA);就可以实现了,而不用写一批的new啊,show啊的
      

  2.   

    或者简单的说就是怎么传递FrmA这样的窗体类型给函数做参数B,应该怎么定义
      

  3.   

    用泛型做会比较好一点:
    public void openForm<TForm>(ref TForm form) where TForm : Form, new()
    {
    if (form != null)
    {
    form.Activate();
    }
    else
    {
    form = new TForm();
    form.Show();
    }
    }使用:private form_a FrmA;//定义类型为form_a的变量FrmA,form_a类应当继承Form类并有公共无参构造函数
    private Form FrmB;
    openForms(ref FrmA);//直接调用,编译器会推断出泛型参数。
    openForms<form_a>(ref FrmB);//如果变量是Form类型,需要显式指定泛型参数(否则将得到一个基类对象)
      

  4.   

    我直接用openForms(ref FrmA) 提示FrmA是“类型”,但此处被当做“变量”来使用,失败,而用openForms(ref form_a)则可以,这是为什么,我想直接用openForms(ref FrmA) 来调用函数
      

  5.   

    从网上找到一个方法,也是用泛型写的,比我原来的思路更好的点,不用先定义private form_a FrmA;   但菜鸟新手不懂怎么用
    /// <summary> 
    /// 打开MDI子窗口并附加到MDI主窗口中,如果MDI主窗口中已经存在相同类型的子窗口,则直接激活 
    /// </summary> 
    /// <typeparam name="T">MDI子窗体类型</typeparam> 
    /// <param name="mdiParent">MDI主窗体引用</param> 
    /// <returns>当前创建或得到的MDI子窗体类型实例的引用</returns> 
    private T OpenUniqueMDIChildWindow<T>(Form mdiParent) where T : Form, new() 

        foreach (Form subForm in mdiParent.MdiChildren) 
        { 
            if (subForm.GetType().Equals(typeof(T))) 
            { 
                subForm.Activate(); 
                return subForm as T; 
            } 
        } 
        T newForm = new T(); 
        newForm.MdiParent = mdiParent; 
        newForm.Show(); 
        return newForm; 
    }
     通过 OpenUniqueMDIChildWindow(FrmA);
    两个提示,1、提示FrmA是“类型”,但此处被当做“变量”来使用
    2、错误 2 无法从用法中推理出方法“Test1.MDIForms.OpenUniqueMDIChildWindow<T>(System.Windows.Forms.Form)”的类型参数。请尝试显式指定类型参数。 我想这两个原理应该是一样的,但菜鸟新手不懂啊求指导
      

  6.   

    因为你在原帖里写了 private form_a FrmA; 所以我认为form_a是类型而FrmA是变量了。你给的这个代码应该在主窗体(MDI父窗体)中这样调用:
    OpenUniqueMDIChildWindow<FrmA>(this);
      

  7.   

    大致如此吧,没实际测试过:public void OpenForm(Type formType, params object[] ps)
        {
           var form =  (Application.OpenForms.FirstOrDefaul(f=>f.GetType() == formType);        if (form != null)
            {
                form.Activate();
            }
            else
            {
                form =(Form)Activator.CreateInstance(formType, ps); 
               form.MdiParent =this;
                form.Show();
            }
        }
    //
    用窗体类型作为参数。调用则是: openForm( typeof(FrmA),  参数1, 参数2,...);