如题
        private void toolStripLabel1_Click(object sender, EventArgs e)
        {
            //怎么先判断类TestForm1的实例是否已经存在,如果已经存在,就直接显示,如果不存在,就先建立再显示?
            TestForm1 testF = new TestForm1(this);
            testF.Show();
        }

解决方案 »

  1.   

    if(Application.OpenForms[testF.Name]==null)这里可以使用名字...如果名字是变量使用GetType.Name把.
      

  2.   

    第一新建窗口后将其放到某容器里
    第二次显示时先判断是否存在该实例,
    有的话直接显示,没有话回到第一次新建窗口
    /// <summary>
            /// 显示窗口
            /// </summary>
            /// <param name="isCodeWindow"></param>
            void OnShowWindow( bool isCodeWindow ) {
                if( this.tstringTreeView.SelectedNode != null && this.tstringTreeView.SelectedNode.Tag is EntityBase ) {
                    this.Cursor = Cursors.WaitCursor;
                    EntityBase entityBase = this.tstringTreeView.SelectedNode.Tag as EntityBase;
                    FrmTemplateEditor frmEditor;                //先判断是否已打开该页面,有的话,直接显示之
                    foreach( var item in this.FrmTstring.TstringEditor.TstringDock.Documents ) {
                        if( item is FrmTemplateEditor ) {
                            frmEditor = item as FrmTemplateEditor;
                            if( frmEditor.TstringGuid == entityBase.Guid ) {
                                frmEditor.IsCodeWindow = isCodeWindow;
                                frmEditor.Show( this.FrmTstring.TstringEditor.TstringDock );
                                this.Cursor = Cursors.Default;
                                return;
                            }
                        }
                    }                //第一次打开该表的设计窗口时,新建窗口并显示
                    frmEditor = new FrmTemplateEditor( entityBase, this.tstringTreeView.SelectedNode, isCodeWindow );
                    frmEditor.Tag = this.FrmTstring;
                    frmEditor.Show( this.FrmTstring.TstringEditor.TstringDock );
                    this.Cursor = Cursors.Default;
                }
            }
      

  3.   

    一楼的方法不行啊,如果有两个窗体的name相同,但是又不是同一个类产生的,那就乱来了。
    二楼的还是不太明白啊,OnShowWindow( bool isCodeWindow )该用在哪个地方?
      

  4.   

    private void toolStripLabel1_Click(object sender, EventArgs e) 
            { 
                if(testf==null || testf.disposed)
    {
                TestForm1 testF = new TestForm1(); 
                testF.Show(); 
    }
    else
    {
                 testf.actived();
    }
            }
    这样就OK!
      

  5.   

    还有一个方法是建立一个静态变量,
    在创建窗体时判断静态变量是否为null,
    如果为空,则建立并显示,
    不为空,则直接显示。
      

  6.   

    public TestForm1 testF;
    private void toolStripButton3_Click(object sender, EventArgs e)
            {
                if (testF == null)
                {
                    testF = new TestForm1(this);
                    testF.Show();
                }
                else
                {
                    testF.Show();
                }         }以上的代码,有问题,就是如果把已经建立的窗口关了,那么在点击button3时,就不再建立并显示了,高手帮看看啊
      

  7.   


    OnShowWindow( bool isCodeWindow )这个是自己定义的方法,本与你的问题无关的就没写出来
    参考代码啊,只是说明了思路大概意思是
    首次加载时新建窗口并保存到列表里(这样的做的好处是可以放多个窗口实例)
    再次加载时先判断列表中有没有该窗口,有直接显示,没有回到首次逻辑,就这样
      

  8.   

    可以遍历所有窗体控件,判断其 type 是否是TestForm1 , 如果是就直接 显示,这样做的问题是,如果你多个窗体实例显示那个好呢.; 再有一个就是,重写TestForm1 创建个单件.
    基本就是
    public class TestForm1 :FROM 
    {
     static TestForm1 form1 ;
     private TestForm1()  //private 构造函数
     {
     }
     public TestForm1 CreateTestFrom1()
     {
      if (form1 != null )
      {
        return form1 ;
      }
      else 
        return new TestForm1();
     }
     public void TestForm1_Closed() //在窗体CLOSED里面把form1 给赋 null ;
     {
       form1 = null ;
     }
    }
    然后使用窗体时 TestForm1 testf = TestForm1.CreateTestForm1();
      

  9.   

    楼上的birdlonger,”
    可以遍历所有窗体控件,判断其 type 是否是TestForm1 , 如果是就直接 显示,这样做的问题是,如果你多个窗体实例显示那个好呢.; “,
    我这么做当然是保证他只有一个实例了,如果有多个,就随便显示一个也无妨。
    我想的就是遍历所有窗体,然后判断窗体的类,可是不知道怎么写那些代码,我的C#不熟练啊,请高手指导
      

  10.   

     遍历子窗体..           
                foreach (Form f in this.MdiChildren)
                {
                    if (f is TestForm1 ) // 此处判断类型是TestForm1 
                    {
                        f.Text = " i love football";
                        f.Show();
                        break ;
                    }
                 }如果遍历子控件的话,用foreach (control c in this.controls)
                      {
                            //此处处理代码.
                      }
      

  11.   

    楼主不用考虑不同命名空间下name属性一样的问题。
    这个C#里自己会判断的。
    上面楼上几种方法楼主都可以。
    思路也很清析了。思路:在窗口容器里对已打开的所有子窗体进行name属性判断是否是当前正要打开的子窗体,是:激活,使它获得焦点,并最大化,
    否:实例化打开
      

  12.   

    楼主不用考虑不同命名空间下name属性一样的问题。 
    这个C#里自己会判断的。 
    刚测试过!
      

  13.   

    以下是公共判断方法
    private bool checkChildFrmExist(string childFrmName)
            {
                foreach (Form childFrm in this.MdiChildren)
                {
                    if (childFrm.Name == childFrmName) //用子窗体的Name进行判断是否已实例化,如果存在则将他激活
                    {
                        if (childFrm.WindowState == FormWindowState.Minimized)
                            childFrm.WindowState = FormWindowState.Normal;
                        childFrm.Activate();
                        return true;
                    }
                }
                return false;
            }            以下是按钮调用
    private void bottom1_Click(object sender, EventArgs e)
            {
                drag.form1subform = new drag.form1();
                if (!checkChildFrmExist(subform.Name.ToString()))
                {
                    subform.MdiParent = this;
                    subform.Show();
                }
            }
      

  14.   

    我也问过类似的问题,:) 我找找那段代码,是建立一个form的容器,然后呢新new 一个放进去,呆会判断就ok了。 等下给你贴下代码,我也是受高人指点=。=
      

  15.   

           class MyForm : frm_sendmessage 
            { 
                int a = 0; 
                static List <MyForm> formList = new List <MyForm>(); 
                string msn_id = null;//写成属性吧,懒得写了. 
                private MyForm(string id) 
                { 
                    msn_id = id;             } 
                public static MyForm GetFormById(string id) 
                { 
                    foreach (MyForm my in formList) 
                    { 
                        if (my.msn_id == id) 
                            return my; 
                    } 
                    MyForm newForm = new MyForm(id); 
                    formList.Add(newForm); 
                    return newForm; 
                }