不讨论程序背景,现在有这样的需求:
在Form1中定义了 
List <Form2> d = new List <Form2>(); 
并定义了 
1)add 
2)remove两个方法。 
在Form1中引用Form2时: 
Form2 frm = new Form2(); 
frm.show(); 
d.add(frm);
现在,需要在Form2关闭后,执行d.remove()操作,目的是将这个实例清除。

解决方案 »

  1.   

    楼主分真多,一个问题开两帖 还有200分。d.remove()这个函数和一个事件绑定,然后在form2的关闭事件中触发它就ok了
      

  2.   

    Form2 frm = new Form2();
    d.add(frm);
    frm.show();
    d.remove(frm);
    frm.Dispose();form2的关闭事件为:
    this.close();
      

  3.   

    楼上我觉得你误会了楼主的意思,d如果为Form1中私有方法在form2中是调用不到的...,所以你显示的写d.Remove()不太合适哦
      

  4.   


        public partial class Form1 : Form
        {
            private List<Form2> d = new List<Form2>();
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {        }        private void button1_Click(object sender, EventArgs e)
            {
              
                Form2 frm = new Form2(this);
                d.Add(frm);
                frm.Show();
            }        public void DoReMove(Form2 frm)
            {
                this.d.Remove(frm);
            }
        }    public delegate void FormHandle(Form2 frm);
        public partial class Form2 : Form
        {
            private Form1 m_Form1;        public event FormHandle DoSomething;        private void OnFormHandle(Form2 frm)
            {
                DoSomething(frm);
            }        public Form2(Form1 frm)
            {
                m_Form1 = frm;
                InitializeComponent();
                DoSomething += new FormHandle(this.m_Form1.DoReMove);
            }        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                this.OnFormHandle(this);
            }
        }~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    我这样写是好的。
      

  5.   

    LZ,这种在两个form间调用,是有技巧的,其实LZ没有搞清,句柄的概念,所以在调用的时候根本不知道是在调那个窗体,.net中一样存在句柄的概念,举例:
    class A_form:form
    {
       B_form b=new B_form();
       b.obj=this;//重点;
       b.show();
    }
    class B_form:form
    {
       public object obj;
       A_form a=(A_form)obj;
    }
    这样A就可以被B调用了,并且也是当前的A_form对象,如果不清楚可以发信息给我
      

  6.   

    lz开2贴,我就贴2遍namespace WindowsApplication25
    {
        public partial class Form1 : Form
        {
            public static List<string> d = new List<string>();        public Form1()
            {
                InitializeComponent();            new Form2().ShowDialog(this);
                MessageBox.Show(d[0]);
            }
        }
    }
    form2:
    namespace WindowsApplication25
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                List<string> d = null;
                d=(List<string>)this.Owner.GetType().GetField("d").GetValue(d);  
                d.Add("aaa");
                Close(); // 关闭form2 
            }
        }
    }
      

  7.   

    override Form2的OnFormClosed方法就可以了啊。
     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private List<Form2> _list = new List<Form2>();        private void Button1_Click(object sender, EventArgs e)
            {
                Form2 form = new Form2(_list);
                _list.Add(form);
                form.Show();
            }      
        } public partial class Form2 : Form
        {
            private Form2()
            {
                InitializeComponent();
            }
             private readonly List<Form2> _list;
            public Form2(List<Form2> list):this()
            {
                _list = list;
            }
            protected override void OnFormClosed(FormClosedEventArgs e)
            {
                base.OnFormClosed(e);
                _list.Remove(this);
            }    }
      

  8.   

    呃,懒得多想了,只问一句:那个form2能不能不用Show而用ShowDialog调用?如果能的话一切都解决了……
    Form2 frm = new Form2(); 
    d.add(frm);
    frm.ShowDialog(); 
    d.remove(frm);