详细描述:MainForm中有个按钮Button1,点击之后弹出Form1。如果我多次点Button1则,Form1会被多次实例化,这是我们所需要避免的。
问题:如果Form1已打开,则不实例化,如果没有打开则实例化。
问题很简单,但我找不到好的办法。在网上看到有用Mutex的方法,但并不好用,混乱的。不要告诉我ShowDialog,我就是要做交互的窗体的。谢谢各位了!            Form1 fdc = new Form1();            bool createdNew; 
            System.Threading.Mutex instance = new System.Threading.Mutex(true, fdc.Name, out createdNew); 
            if (createdNew) 
            {
                fdc.Show();
                instance.ReleaseMutex(); 
            } 
            else 
            {
                fdc.Close();
            } 

解决方案 »

  1.   

    给你一段代码,编程要注意总结。
      #region MDI函数
            private bool ContainMDIChild(string ChildTypeString)
            {
                bool res = false;
                Form myMDIChild = null;
                foreach (Form f in this.MdiChildren)
                {
                    if (f.GetType().ToString() == ChildTypeString)
                    {
                        myMDIChild = f;
                        break;
                    }
                }
                if (myMDIChild != null)
                {
                    myMDIChild.WindowState = FormWindowState.Normal;
                    myMDIChild.Show();
                    myMDIChild.BringToFront();
                    res = true;
                }
                return res;
            }        private void setMdiChild(Form frm)
            {
                frm.Owner = this;
                frm.MdiParent = this;
                frm.MaximizeBox = false;
            }        private void showForm(Form frm)
            {
                frm.Show();
                frm.BringToFront();
                frm.Height = frm.Parent.Height - 5;
                frm.Width = frm.Parent.Width - 5;
                frm.Top = 0;
                frm.Left = 0;
            }        #endregion调用时候:
    string fullName = strNamespace + "." + frmName;//命名空间+窗体名
                    if (!ContainMDIChild(fullName))
                    {
                        object objType = Assembly.Load(strNamespace).CreateInstance(fullName);
                        Form frm = (Form)objType;
                        setMdiChild(frm);
                        showForm(frm);
                    }
      

  2.   

    声明一个全局变量
    Form2 f=null;
    在Button1的click事件中写if (f == null)
                {
                    f = new Form2();
                    f.Show();
                }
      

  3.   

    额,忘记说了,我不用Mdi来实现,因为我改不了主窗体,我做的子窗体是一个类,我只能修改baseCommand里的代码,来实现这个功能。
      

  4.   

    子窗体是一个类,就对了, 建议你看一下设计模式中的单例模式。
    大概设计类的思路是这样的:Class SingleClass
    {
       private static SingleClass instance = null;
       private SingleClass()
       {}
       
       public static SingleClass GetInstance()
       {
           if(instance == null)
           {
               instance = new SingleClass();
           }
           return instance;
       }
    }
      

  5.   

    1楼的 Form myMDIChild = null;
      改成 static  Form myMDIChild = null;
      

  6.   

    若是用new 来调用,建议冲在下构早函数。
      

  7.   

           Public static Form1 frm; 
         
           public void CheckFormShow()  //判断界面是否打开
            {
                if ((frm == null) || (frm.IsDisposed))
                {
                    frm= new FrmRptQuery();
                    frm.Show();
                }
                else
                {
                    frm.Activate();   //激活
                }
            }
            窗口关闭时 让frm = null;
      

  8.   

    上面打错了  
    Public static Form1 frm;  
        
      public void CheckFormShow() //判断界面是否打开
      {
      if ((frm == null) || (frm.IsDisposed))
      {
      frm= new Form1();
      frm.Show();
      }
      else
      {
      frm.Activate(); //激活
      }
      }
      窗口关闭时 让frm = null;
      

  9.   


    这必须在主窗体里声明Form1为全局变量啊,问题是我没有办法操作主窗体,都是别人封装好的,调用方法都固定思路,我只能写子类。
      

  10.   

    1、判断子窗体是否被打开
    public bool checkchildFrmExist(string childFrmName)
            {
                foreach (Form childFrm in this.MdiChildren)
                {
                    if (childFrm.Text.ToString() == childFrmName)
                    {
                        if (childFrm.WindowState == FormWindowState.Minimized)
                        {
                            childFrm.WindowState = FormWindowState.Normal;                    }
                        childFrm.Activate();                    return true;                }
                }
                return false;
            }2、子窗体调用
    private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
            {
                if (checkchildFrmExist("用户管理") == true) { return; }
                Frm_userAdd form1 = new Frm_userAdd();
                form1.MdiParent = this;
                form1.Show();
                form1.WindowState = FormWindowState.Maximized;
                
            }
      

  11.   

    到现在也没解决,最后一问:谁能给讲下Singleton的用法,做个单例模式的窗体。没人回答就结贴了。
      

  12.   

    用一个hashtable 记录窗体的打开记录
    打开一个窗体后,记录窗体name 到hashtable里面
    每次打开前遍历这个hashtable 看有没有存在的记录
    关闭窗体就 删除里面的记录