新建一个WinForm工程(此时有了窗体Form1),给工程增加一个窗体Form2.
在Form1上加一个按钮,Click代码如下: 
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
}
当我点form1.button1按钮的时候,可以Show出form2, 可是当我多次点击button1,会弹出多个form2窗体,可是我只想弹出一个form2窗体(也就是说如果form2窗体不存在则创建并show出,如果已经存在,则仅仅只是把它show出来)!!!请问怎么写???(注:
我尝试把代码改成如下那样。
Form2 form2;
private void button1_Click(object sender, EventArgs e)
{
    if (form2 == null)
        form2 = new Form2();
    form2.Show();
}
当我第一次点button1的时候,可是show出form2, 然后我关掉form2, 再去点form1.button1,报错: 无法访问已释放的对象!
)

解决方案 »

  1.   

    private void button1_Click(object sender, EventArgs e) 

        Form2 form2 = new Form2(); 
        form2.ShowDialog(); 

      

  2.   

    if (form2 == null || form2.IsDisposed) 
    {
        form2 = new Form2(); 
        form2.Show(); 
    }
      

  3.   

    bool checkFrm(Form frm)
    {
    foreach(Form fin this.OwnedForm)
    {
    if(f==frm)
    {
    retrun true;
    }
    }
    retrun false;
    }
      

  4.   

    Show的时候用new Form2().Show(this);
      

  5.   

    在Form2中响应FormClosing事件:
    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();
        e.Cancel = true;
    }
      

  6.   

    这些回答是不能解决问题的。
    1楼 没明白具体要求是什么,你说的那个是模态的,要求应该是非模态的,他说了还可以再打开form2的。
    隐藏不是解决问题的办法,不过可以实现要求,看起来效果是一样的。
    3楼 这段程序好像有点逻辑错误。 form2 = new Form2(); 这句话是赋值吧,没有赋值怎么就能判断。
    4楼 这个思想应该是对的。个人想法,和大家交流下。
      

  7.   


            Form2 form2;
            Form2 form2;
            private void button1_Click(object sender, EventArgs e)
            {
                if (form2 == null)
                {
                    form2 = new Form2();
                    form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
                }
                form2.Show();
            }        void form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                form2 = null;
            } 
      

  8.   

    随便加个bool 值就可以判断了,判断按钮是否点击过你甚至可以把按钮变成不可用。
    ShowDialog()是可以的,不过我不喜欢,因为它会把show出来的窗体放到最上层,
    而且好像还不能调···········
      

  9.   


        private void OpenForm_Click(object sender, EventArgs e)
        {
          Form f = Application.OpenForms["Form2"];  //查找是否打开过Form1窗体
          if (f == null)  //没打开过
          {
            Form2 fa = new Form2();
            fa.Show();   //重新new一个Show出来
          }
          else
          {
            f.Focus();   //打开过就让其获得焦点
          }
        }
      

  10.   

    用不着那么麻烦,这样就行了 Form19 frm;
       private void button2_Click(object sender, EventArgs e)
            {
                if(frm==null || frm.Visible == false)
                    frm = new Form19();
                frm.Show();        }
      

  11.   

    如果楼主坚持用Show而不用ShowDialog的话,看看下面的
                if (form2 == null)
                {
                    form2 = new Form2();
                    form2.Show();
                    form2.Activate();
                }
                else if (form2.CanFocus)
                {
                    form2.Activate();
                }
                else
                {
                    form2 = new Form2();
                    form2.Show();
                    form2.Activate();
                }
      

  12.   

    你的代码改一处就可以
    Form2 form2; 
    private void button1_Click(object sender, EventArgs e) 

        if (form2 == null || !form2.Created) 
            form2 = new Form2(); 
        form2.Show();