今天复习了一下C#委托与事件,顺便研究了一下自定义事件,写了下面的一个类
/*
 public class ActionClass 
    {
        public delegate void TestActionEventHandler(object sender, ActionCancelEventArgs e);        public event TestActionEventHandler TestAction;        public void Class_Load(object sender, ActionCancelEventArgs e)
        {
            if (sender != null)
                TestAction(sender, e);
        }
    }
*/之后我有个疑惑,自定义事件在调用时,必须要手工增加类的实例.Class_Load这个方法,如:
            ActionClass win = new ActionClass();
            win.TestAction += new ActionClass.TestActionEventHandler(this.win_TestAction);
            win.Class_Load(win,new ActionCancelEventArgs());但我使用winForm控件,拖一个Button在界面上,添加Click事件时,却不用手工再去调用Button里面的那个方法手工触发。为何这些控件里面不须手工触发?

解决方案 »

  1.   

    其实也有一个触发它的方法OnClick
      

  2.   

    事件是一种模式
    使用委托来实现的,需要你手动触发的
    if (sender != null)
      TestAction(sender, e);这句也有问题,你应判断TestAction事件是否为null.这个控件实际上也是有触发的,不过他们是写在基类里了,注册处理器也许在其他的部份类中了。
      

  3.   

    win.Class_Load(win,new ActionCancelEventArgs());//不能这样触发事件,事件只能由内部触发,而你这明显是由外部触发你的事件了,
    并且C#的规范是以On打头,如:OnClick,OnLoad();这些事件触发器大多是protected的虚方法;
    如:
    public class XX
    {
     public event EventHandler<EventArgs> MyEvent;
     
     protected virtual void OnMyEvent(EventArgs e)
     {
       if(MyEvent!=null)
        {
           MyEvent(this,e);
         }
     }
    }
      

  4.   

    sender 一般是ActionClass  实例才对
      

  5.   

    内部触发也是用的委托,只不过已经写好了,不用再去写了。原理是一样的,拿button打个比方,你看看button的元数据,里面很多虚方法。
      

  6.   


    内部触发其实也很简单的,比如:我有一个文件管理类,当我打开一个文件成功后,就触发一个文件打开事件:public class FileManager
    {
     //这个就是事件了,使用默认的事件参数,当然你可以从EventArgs继承并实现自己的事件参数类
     public event EventHandler<EventArgs> FileOpened;//这个就是保护的虚方法,在这里我叫它事件触发器,因为这个方法可以触发挂接到FileOpened事件上的所有事件;
     protected virtual void OnFileOpened(EventArgs e)
     {
       EventHandler<EventArgs> eh=FileOpened;
       if(eh!=null)
       {
          eh(this,e);
       }
     }
     //好,接下来我写一个打开文件的方法,当文件打开成功则触发FileOPened事件
     public Boolean OPenFile()
     {
       String filename="c:\1.txt";
       //.....当文件打开成功时,执行下面的代码
        OnFileOpened(EventArgs.Empty);//这里就触发了类中的事件:FileOpened;
     }
    }自己体会一下,然后写写代码,估计就掌握了,其实C#中的事件还是很简单的;
      

  7.   

    这些事件也是手工触发的  只是不是由你的代码  是framework的代码  封装了win32API,windows消息
      

  8.   

    虽然不太讲究,不过做成用户控件好像就不用手工触发了,原理和默认的button一样