private void button1_Click(objectsender,System.EventArgs e)
         {
  Form2 f2=new Form2();
  f2.Show();
 }
private void button2_Click(objectsender,System.EventArgs e)
         {
  Form2 f2=new Form2();
  f2.Close();
 }
//点击button2,怎么关不掉button1打开的form2?
我是初学者,请各位指教,谢谢!

解决方案 »

  1.   

    当然不可以,因为你第二次又new了一个FORM,两者是不同的。
    他们在内存中是两块不同的空间。你把FORM2写成全局变量吧。而且一般都是只接在FORM2上点击关闭的,不知道你这么做是为了什么?
      

  2.   

    thanks andy!
     form2本是就是全局变量,我想通过form1的button2来关闭form2 ,请各位指点!
      

  3.   

    你可以把form2放在form1的子中就可以了。
      

  4.   

    请问怎么设form2为form1的子窗体? Thanks!
      

  5.   

      Form2 f2=new Form2();
    private void button1_Click(objectsender,System.EventArgs e)
             {   f2.Show();
     }
    private void button2_Click(objectsender,System.EventArgs e)
             {
     
      f2.Close();
     }
      

  6.   

    按你原来的方式,两个FORM2根本就指向不同的内存,BUTTON2里你只是新加了一个FORM,然后把它关闭,而没有操作BUTTON1里的FORM2。
      

  7.   

    private Form2 frm;
            private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.Show();
            }        private void button2_Click(object sender, EventArgs e)
            {
                frm.Close();
            }
      

  8.   

    TO:andy_1027(天地昊天) 你这样的话,如果窗体在打开关闭一次后,再打开的话会有异常的...因为关闭后,窗体对象已经被释放...
      

  9.   

    再加个判断:private Form2 frm;
            private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.Show();
            }        private void button2_Click(object sender, EventArgs e)
            {
                if (frm != null)
                {
                    frm.Close();
                }
            }
      

  10.   

    Form1:
    private void button1_Click(object sender, System.EventArgs e)
    {
        Form2.InstanceForm = new Form2();
     Form2.InstanceForm.Show();
    } private void button2_Click(object sender, System.EventArgs e)
    {
        Form2.InstanceForm.Close();
    }Form2:
    public class Form2 : System.Windows.Forms.Form
    {
    public static Form2 InstanceForm = null;
      

  11.   

    请问liujia 
    如果点击两次button1,则打开两个form2,但再点击button2关闭form2 时,只能关闭一个form2,请指教?
      

  12.   

    你想实现什么效果?点击按钮,弹出Form2,然后不论再点击多少次,都不会再弹出了,是这样吗?
      

  13.   

    To liujia:
       我只是想把点击button1打开的form2通过点击button2来关闭,你上面的方很好!
    但是如果我连续打开两个form2, 再点button2时,只能关闭最后打开的form2,之前的form2关不掉!
      

  14.   

    你的意思是允许弹出多个Form2,但在点击关闭时,必须把所有的Form2都关闭,是这样吗?
      

  15.   

    To liujia:
       如果要关闭所有form2,请问怎么实现?!!!
      

  16.   

    既然要打开很多个,那就需要一定的管理,在打开Form2时,最好将Form2设置为Form1的子Form,Form2 frm = new Form2();
    frm.Owner = this;这样可以遍历所有打开的Form2,并根据Form2的Name属性,决定关闭哪一个。foreach(Form frm in this.OwnedForms)
    {
      if(frm.Name = "XXXXX")
      {
        frm.Close();
      }
    }
      

  17.   

    关掉所有的也可以用上面的方法foreach( Form frm in this.OwnedForms )
    {
    if( frm is Form2 )
        frm.Close();
    }
      

  18.   

    TO:如果要关闭所有form2,请问怎么实现?!!!如果这样的话,那楼上的方法可以...
      

  19.   

    private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm = new Form2();
                frm.Name = "frm";//此处要设置一个Name属性,否则name属性为""
                frm.Owner = this;
                frm.Show();        }        private void button2_Click(object sender, EventArgs e)
            {
                foreach (Form frm in this.OwnedForms)
                {
                    if (frm.Name == "frm")
                    {
                        frm.Close();
                    }
                }        }
      

  20.   

    先clear一下你的问题,点击button1的话,是只能打开一个窗体?还是可以打开多个窗体?
    如果只可以打开一个窗体的话,这涉及到单实例的问题,可以用singleton模式实现。如果是可以打开多个窗体的话,要对窗体进行管理了,你可以用container来管理using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            IContainer container;
            public Form1()
            {
                InitializeComponent();
                container = new Container();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2();
                container.Add(form2);
                form2.Show();
            }        private void button2_Click(object sender, EventArgs e)
            {
                container.Dispose();
            }
        }
    }
      

  21.   

    Form2 f2=new Form2();
    private void button1_Click(objectsender,System.EventArgs e)
             {  f2.Show();
     }
    private void button2_Click(objectsender,System.EventArgs e)
             {
     
      f2.Close();
     }
      

  22.   

    private Form2 frm;
            private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.Show();
            }        private void button2_Click(object sender, EventArgs e)
            {
                if (frm != null)
                {
                    frm.Close();
                }
            }
    ------------------------------------------
    支持。LZ看看。
      

  23.   

    zuo_hy(长河精工) ( ) 信誉:100    Blog  2006-12-01 11:52:03  得分: 0  
     
     
       private Form2 frm;
            private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.Show();
            }        private void button2_Click(object sender, EventArgs e)
            {
                if (frm != null)
                {
                    frm.Close();
                }
            }
    ------------------------------------------
    支持。LZ看看。
      
     
    ------------------------------
    支持个头呀,这段代码明显是错的。frm不等于空,不代表内部资源没有释放。
      

  24.   

    我的blog有介绍。应该是非常的合理的。
      

  25.   

    http://blog.csdn.net/wuyazhe/archive/2006/11/23/1406795.aspx
      

  26.   

    private Form2 f2=new Form2();//把Form2的实力化定义成一个常量
    private void button1_Click(object sender, System.EventArgs e)
    {
    f2.Show();
    }
    //Button1实现的是打开2窗体
    private void button2_Click(object sender, System.EventArgs e)
    {
    f2.Close();
    }
    //Button2实现的是关闭2窗体
    //着是在Form1中的代码
      

  27.   

    补充一下 如果点了Button2(关闭2窗体)后,在点Button1的话就回出错误,因为你没有释放内存!
    不过估计你也不回用着个
    呵呵
      

  28.   

    TNND,怎么没人支持我这个呢,单件模式。弹出N个窗体的需求,除非你有病玩大家
    Form1:
    private void button1_Click(object sender, System.EventArgs e)
    {
        Form2.InstanceForm = new Form2();
     Form2.InstanceForm.Show();
    }private void button2_Click(object sender, System.EventArgs e)
    {
      if (Form2.InstanceForm != null)
     {    
      Form2.InstanceForm.Close();
      }
    }Form2:
    public class Form2 : System.Windows.Forms.Form
    {
    public static Form2 InstanceForm = null;
      

  29.   

    maoliner(控制面板) ( ) 信誉:100    Blog  2006-12-01 13:28:55  得分: 0  
     
     
       TNND,怎么没人支持我这个呢,单件模式。弹出N个窗体的需求,除非你有病玩大家
    Form1:
    private void button1_Click(object sender, System.EventArgs e)
    {
        Form2.InstanceForm = new Form2();
     Form2.InstanceForm.Show();
    }private void button2_Click(object sender, System.EventArgs e)
    {
      if (Form2.InstanceForm != null)
     {    
      Form2.InstanceForm.Close();
      }
    }Form2:
    public class Form2 : System.Windows.Forms.Form
    {
    public static Form2 InstanceForm = null;  
    -----------------------------------------------------------程序不对,还要人看,你这不是误导人家么,你先点击button1打开一个窗口,然后点击右上方的x关闭按钮关闭,然后再点击一下button2,把报错的msg给大家看看吧。