32.4 How do I check to see if a child form is already displayed so I don't have two instances showing?     Here are two ways you can do this. i) Within the parent MDI form, use code such as this: 
 
     // MyChildForm is the one I'm looking for 
 
     MyChildForm childForm = null; 
 
     foreach(Form f in this.MdiChildren) 
 
     { 
 
          if(f is MyChildForm) 
 
          { 
 
               // found it 
 
               childForm = (MyChildForm) f; 
 
               break; 
 
          } 
 
     } 
  
     if( childForm != null) 
 
     { 
 
          childForm.Show(); 
 
          childForm.Focus(); 
 
     } 
 
     else 
 
     { 
 
          childForm = new MyChildForm(); 
 
          childForm.MdiParent = this; 
 
          childForm.Show(); 
 
          childForm.Focus(); 
 
     }
 

解决方案 »

  1.   

    受教了!
    打开普通窗体!
    //在CLICK外先定义frm;
    zjdb frm=null;private void pictureBox3_Click(object sender, System.EventArgs e)
    {

    if(frm==null)
    {
    frm=new zjdb();
    frm.Show();
    }
    frm.Focus();
    }
      

  2.   

    private void pictureBox3_Click(object sender, System.EventArgs e)
    {
    zjdb frm=new zjdb();
    frm.Show(); //错误
                               frm.ShowDialog();
    }
      

  3.   

    一个笨方法,但我以前就这样解决这个问题的。其中,我得情况是每个form的name属性肯定不一样,所以我用name属性来标志唯一。你的如果不能用name的话,就从form派生出一个类。器一个元素为唯一标志,另一个元素为Form.public class FormItems
    {
    private static ArrayList _forms = new ArrayList();
    public static void Insert(Form form)
    {
         _forms.Add(form);
    } public static void Delete(Form form)
    {
         _forms.Remove(form);
    } public static Form GetForm(string str)
    {
         foreach(Form form in _forms)
         {
     if(form.Name == str)
      {
       return form;
      }
         }
         return null;
    }其中,生成一窗口时,可指定其名称
    当点击picturebox时,可以得到一于picturebox相关的唯一变量.假设为str
              MyForm form;
              form = (MyForm)FormItems.GetForm(str);
              if(form == null)
                 {  
                    form = new MyForm();
                    form.Name = str;
                 }
              FormItems.Insert((Form)form);
              form.Show();
             当窗口关闭是
              在窗口closed响应中加入:
                FormItems.Remove((Form)this);
    另外上面的FormItems中的ArrayList变量可以根据情况分配,释放空间。不过我没试,你自己可以试一下。另外我还是感觉这个方法比较笨。
      

  4.   

    上面的显示代码有点问题:
             MyForm form;
             form  = (MyForm)FormItems.GetForm(str);
             if(form == null)
             {
                   form = new MyForm(); 
                   form.Name = str;
                   FormItems.Insert((Form)form); 
                   form.Show();
             }
             else
             {
                     form.Activate();
              }          关闭窗口时:
                   FormItems.Delete((Form)this);
      

  5.   

    改关闭的窗体太麻烦了,不用那么复杂,将楼上的代码改一下就可以了。
    受教了!
    打开普通窗体!
    //在CLICK外先定义frm;
    zjdb frm=null;private void pictureBox3_Click(object sender, System.EventArgs e)
    {

    if(frm==null || frm.Disposing=true) 
    {
    frm=new zjdb();
    frm.Show();
    }
    frm.Activate();
    }
    这样就可以了。
    窗体关闭以后也可以再次打开。
      

  6.   

    SimerJoe(浪月) 
    后来一调试,还真的不行!
    自己没找出解决方法!谢谢了!
      

  7.   

    SimerJoe(浪月) 
    关闭窗体以后,还是打不开窗体!
    if(frm==null || frm.Disposing=true) 
    //还是
    if(frm==null || frm.Disposing=t=rue)
      

  8.   

    方案还挺多,我也凑个热闹。
    如果真是只能打开一个,那就用Singleton模式。
    如果要精确控制打开n个,那在子窗体中加个static的计数器,每创建时判断是否已创建够了。创建一个,计数器++,每关闭一个计数器--
      

  9.   

    不好意思,我打错了!
    应该是:
    在方法外部定义:
    Print p
    在方法内部写:
    if(p==null || p.IsDisposed)
    {
      p=new Print();
      p.Show();
    }
    else
    {
      p.Activate();
    }
    绝对可行。
      

  10.   

    在方法外部定义:
    Print p
    在方法内部写:
    if(p==null || p.IsDisposed)
    {
      p=new Print();
      p.Show();
    }
    else
    {
      p.Activate();
    }
    绝对可行。打开本窗体是可以了!
    但是,当本窗体还打开时,再打开别的窗体就不行了!
    请你再指点一下!