事情是这样发生的。首先我新建一项目,然后在窗体中拉入一个button,再新添一个窗体点击button,在此button事件中显示form2
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show();
        }
我新建一个类class1,然后在这个类中添加事件以及一个方法
    class Class1
    {
        public delegate void EventHanderTest();
        public static event EventHanderTest eht;
       
        public static void test()
        {
            if (eht != null)
                eht();        }
    }
在新建的form2中我拉入button并在这个button事件中添加调用方法,在from2这个窗体load时我注册class1中的事件
static i=0;
        private void button1_Click(object sender, EventArgs e)
        {
            Class1.test();
        }        private void Form2_Load(object sender, EventArgs e)
        {
            Class1.eht += new Class1.EventHanderTest(Class1_eht);        }
        void Class1_eht()
        {
            i++;
            MessageBox.Show("第"+i+"次");
        }
各位请注意问题来了.当我运行时,打开form2的时候第一次点button调用是正常的,但当我把form2关闭然后再点击form1中的按钮打开form2,然后点窗体form2中的button调用class1中的方法让它发送事件,此事我点一次它却发了两次事件,原因可能是当第一次关闭form2时这个事件没有释放掉。我的问题是form2关闭时为什么它注册的事件没有和它一起消失呢`如何解决这样的问题

解决方案 »

  1.   

    它是静态的:public static event EventHanderTest eht; 
      

  2.   

    UP, 把事件定义在Load里面:
      private void Form2_Load(object sender, EventArgs e)
            {
    event EventHanderTest eht; 
                eht += new Class1.EventHanderTest(Class1_eht);        } 
      

  3.   

    1.不声明为静态成员,创建新对象然后为此事件添加处理方法。
    2.保持静态,但在Form_Load中附加的事件处理方法,在Form_Closing或Form_Closed中移除:
    Class1.eht -= new Class1.EventHanderTest(Class1_eht); 
    对于将事件声明为静态,我始终觉得有点怪异的感觉。