现在有一个父窗体mainfrm,点击父窗体mainfrm菜单弹出子窗体childfrm。怎么才能实现:随便你点多少次父窗体mainfrm菜单,始终只弹出一个子窗体childfrm啊。

解决方案 »

  1.   


        Form2 frmF = null;
        private void button2_Click(object sender, EventArgs e)
            {
                if (frmF == null || frmF.IsDisposed)
                {
                    frmF = new Form2();
                    frmF.Show();
                }
                else
                {
                    frmF.Activate();
                }
            }
      

  2.   

    其实这个问题,就是经典的23种设计模式中的单件模式(singleton),下面用c#实现之: 首先我们有2个windows form,主窗体叫form1,子窗体叫childform。在主窗体中加入一menu,用来实例化子窗体,我们在form1.cs中写入下代码: private static childform childform; //静态变量,保存唯一实例 private void menuitem2_click(object sender, system.eventargs e) 

    childform childform = getchildform(); //获取子窗体对象 
    childform.show(); //显示之 
    } private childform getchildform() 

    //先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了 
    if( childform == null || childform.isdisposed ) 
    { //第一次实例化也好,被关了也好,都重新实例化 
    childform = new childform(); 
    childform.mdiparent = this; 
    } return childform; 

      

  3.   

    Form2 frmF = null;
        private void button2_Click(object sender, EventArgs e)
            {
                if (frmF == null || frmF.IsDisposed)
                {
                    frmF = new Form2();
                    frmF.Show();
                }
                else
                {
                    frmF.Activate();
                }
            }
      

  4.   

    楼上正解阿  来晚了   留个名  我建议楼主看看WebCast上的东东,那里有个例子基本和楼主问的问题一样
      

  5.   

    yumanqing(每天进步一点点)正解    刚才打字太慢了  呵呵
      

  6.   

    楼上已有答案..只需做个判断就行...
    if( childform == null || childform.isdisposed )
      

  7.   

    以前我也用public static这种方法,后来觉得不好,占内存,也不符合编码规范,就换了种思路来实现。
    2005下使用:
            /// <summary>
            /// 查找是否已创建窗体
            /// </summary>
            /// <param name="FormName">窗体Name</param>
            /// <returns></returns>
            public static bool SearchAllForm(string FormName)
            {
                for (int i = 0; i < Application.OpenForms.Count; i++)
                {
                    if (Application.OpenForms[i].Name == FormName)
                    {
                        return true;
                    }
                }
                return false;
            }
    2003下使用:        [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);        [DllImport("user32.dll", EntryPoint = "FindWindowEx")] //找子窗体
            private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);        [DllImport("User32.dll", EntryPoint = "SendMessage")] //用于发送信息给窗体
            private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
            /// <summary>
            /// 查找是否已创建窗体
            /// </summary>
            /// <param name="FormTitle">标题名称</param>
            /// <returns></returns>
            public static bool SearchForm(string FormTitle)
            {
                IntPtr ParenthWnd = new IntPtr(0);
                IntPtr EdithWnd = new IntPtr(0);            //查到窗体,得到整个窗体 
                ParenthWnd = FindWindow(null,FormTitle);
                if (!ParenthWnd.Equals(IntPtr.Zero))
                {
                    return true;
                }
                else
                {
                    return false;
                }        }
      

  8.   

    Form1 childfrm = null;
                        foreach (Form f in this.MdiChildren)
                        {
                            if (f is Form1)
                            {
                                childfrm = (Form1)f;
                                break;
                            }
                        }
                        if (childfrm != null)
                        {
                            childfrm.Show();
                            childfrm.Focus();
                        }
                        else
                        {
                            childfrm = new Form1();
                            childfrm.MdiParent = this;
                            childfrm.Show();
                            childfrm.Focus();
                        }
      

  9.   

    //在你的主form class里面增加下面这个函数,传入要激活或要新创建的子窗体
    private CheckChildFrmExists(string ChildName)
    {
      foreach(Form newFrm in this.MdiChildren)
      {
        if(childFrm.Name == childFrmName)
        {
         if(childFrm.WindowState == FormWindowState.Minimized)
    childFrm.WindowState = FormWindowState.Normal;
    childFrm.Activate();
    return true;
         }
       }
    }
    //最后在调用子窗体的代码里面增加调用上面的函数的代码,如下
    if (this.checkChildFrmExist("WareDataManage") == true)
      {
       return;
       }
       WareDataManage newFrm = new WareDataManage(true);
       newFrm.MdiParent = this;
       newFrm.Show();
      

  10.   

    用单例模式
    private static childform childform; //静态变量,保存唯一实例 private void menuitem2_click(object sender, system.eventargs e) 

    childform childform = getchildform(); //获取子窗体对象 
    childform.show(); //显示之 
    } private childform getchildform() 

    //先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了 
    if( childform == null || childform.isdisposed ) 
    { //第一次实例化也好,被关了也好,都重新实例化 
    childform = new childform(); 
    childform.mdiparent = this; 
    } return childform;