导航

原文:http://msdn.microsoft.com/zh-cn/library/w369ty8x.aspx

 MSDN的解释看的有点晕,总结一下需要注意的几点:

如果有理解的不对的地方,请路过的朋友看到发挥下同情心一定告知,不胜感激!

 

自定义一个事件并处理它需要完整的四个步骤:

1.声明一个委托类型

2.声明此委托类型的事件

3.在需要抛出事件的类中发布事件

4.在需要处理事件的类中订阅事件(即指定此事件的处理函数)

 

但是,

MSDN:

虽然您定义的类中的事件可基于任何有效委托类型(甚至是可返回值的委托),但是,通常建议您使用 EventHandler 让事件基于 .NET Framework 模式

 

所以看看怎么使用.NET Framework模式的事件。

.NET中已声明了两种委托类型:

1:EventHandler 非泛型委托 (不可传递参数)

publicdelegatevoidEventHandler(
Objectsender,
EventArgs e
)

其中:EventArgs类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。

 

2:EventHandler<TEventArgs> 泛型委托 (可传递参数,如果需要与事件一起发送一个自定义数据类的对象,则这个数据类必须继承自EventArgs类

public delegate void EventHandler<TEventArgs>(
Object sender,
TEventArgs e
)
where TEventArgs : EventArgs  

 

所以在使用.NET框架的事件时注意:


1.定义自己需要传递的数据类型,使之继承自EventArgs类(如果在抛出事件时不需要传递参数,则省略此步)

2.关于何时仍需要自己声明委托:

  1)如果要带返回值,则必须声明自己的委托,委托以 EventHandler 结尾;

  2)如果不用带返回值,也不用传递参数,则使用.NET中的EventHandler 非泛型委托即可,不用自己声明;

  3)如果不用带返回值,但需要传递参数:

     a)使用非泛型委托,需自己声明,如:        

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

 

    b)使用.NET泛型委托,不用自己声明,直接声明委托事件即可,如:

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

 

 

  在Winform编程中,窗口间经常要有数据交互,事件就很有用。例如在主窗口中控件选中一个用户单击编辑,弹出一个编辑框,在编辑框修改user,将修改更新到主窗口中的user对象、主窗口中控件所显示的user内容。如果在弹出对话框时直接将主窗口本身和user所在的usermanagement管理类对象传给编辑窗口,在编辑窗口中直接操作修改这两个对象,则1耗费内存,2逻辑不好。应该本着:控件/数据对象属于哪个类就在哪个类编辑的原则实现。

  考虑在编辑窗口类中定义userEdited事件,当编辑完成单击OK时将编辑框内的新值封装成一个newuser对象,抛出userEdited事件并将newuser当做参数传递出去。在主窗口中订阅这一事件的处理函数为usermanagement类中相应的的user编辑函数,操作便可实现。