当前位置 >> 课程学习 >> 第4章 >> 4.5 委托与事件

4.5 委托与事件

4.5.1 事件

    1.事件的相关概念
    虽然可以将VB.NET项目可视化为一系列按序执行的过程,但实际上,大多数程序是事件驱动的,即执行流程由外部发生的事情(称为“事件”)决定的。所以事件程序是VB.NET程序设计的核心。
    事件是有对象发出的消息,通知有事情发生。事件是一个信号,它告知应用程序有重要情况发生。例如:,用户单击窗体上的Button1控件时,窗体可能会引发一个Click事件。
    事件发送器:任何能引发事件的对象都是事件发送方,也称“事件源”。窗体、控件和用户定义的对象都是事件发送器。例如用户单击窗体上的Button1控件时,事件发送器就是这个控件Button1。
    事件处理程序:它是相应事件发生时调用的过程。可以将任何有效过程用作事件处理程序。可是不能将函数用作事件处理程序,因为它不能将值返回给事件源。例如,用户单击窗体上的某个控件时,窗体可能会引发一个Click事件,并调用一个处理该事件的过程Button1_Click。
    2.Handles关键字
    在设计过程中使用Handles关键字用于声明某个过程处理一个指定事件。其使用语法格式如下:
    procdec Handles eventlist
    其中,procdec指将处理事件的过程的声明,eventlist是要处理的procdec的事件的列表。
    在VB.NET中事件通过委托关联到事件处理程序,使得能够为多个对象创建一个事件处理程序。
    3.建立事件
    除了在设计阶段设计事件处理过程的方法,在运行阶段也可以动态地设计事件处理过程,一般是在类中进行的。
    在类中除了有属性和方法之外,还有事件。事件是一种激发机制,通过事件的声明与激发机制,可以使对象具有与应用程序进行交互的能力。
    事件与属性、方法的最大区别在于:属性和方法对应的代码是在创建类时预先设计好的。当类的使用者调用什么方法,则系统自动地调用相应的代码。对于事件,在创建类时,只需声明事件,并决定在什么地方中被触发,对于响应事件后,应用程序执行什么样的操作由类的使用者来决定。
    在类中建立事件,其基本过程如下:
    (1)在类中使用Event语句声明一个事件
    其语法格式如下:
       Public Event 事件名(参数列表)
       其中,“参数列表”与过程或函数定义的参数列表时一样的。
    (2)在类中的某个方法中,使用RaiseEvent语句激发事件
    其语法格式如下:
       RaiseEvent 事件名(实参列表)
    (3)定义事件处理过程
    定义事件处理过程的方式和定义普通过程相同。
    (4)使用AddHandler来指定对象的事件过程
    AddHandler语句动态地将事件与事件处理程序过程连接。其语法格式如下:
       AddHandler event,AddressOf eventhandler
       其中,event指要处理的时间的名称,eventhandler指对应的事件处理过程的名称,AddressOf是委托运算符。
    (5)使用WithEvents语句
    用Handler关键字需要指出时间“事件源”,将事件和事件处理过程的关联称为静态关联,相对比,AddHandler关键字实现的是动态关联。
    如果对象是过程中声明的(局部对象变量),只能采用AddHandler语句进行动态关联。使用Handler关键字也可以进行动态关联,但需将对象声明为全局对象变量,而且还要用WithEvents语句来声明,方可用Handler来定义事件处理过程。其语法格式如下:
       Dim WithEvents 对象 As New类名
    说明:
      在Handler关键字进行动态关联时,必须用WithEvents语句声明的对象才可以响应在类中的事件,否则对象对所生成的任意事件都将忽略。
      为对象响应改事件编写事件处理过程。这与以前编写的事件处理过程方法相同,编写事件处理过程时,应以“对象名_事件名”作为事件处理过程的过程名,并以Handler关键字来指定此过程所要处理的是哪一个事件,其语法格式如下:
       Private Sub对象名_事件名(参数列表) Handles 对象名.事件名