事件和事件处理(针对 Visual Basic 6.0 用户)

更新:2007 年 11 月

如果您熟悉 Visual Basic 6.0 中的事件和事件处理,则 Visual Basic 2008 中的事件模型开始时似乎使人感到混淆,但最终您会发现该事件模型更为简单而功能要强大得多。

概念差异

在 Visual Basic 6.0 中,事件关联到特定的对象,并且有自己的事件处理代码。例如,在具有一个按钮和一个菜单的窗体上,按钮和菜单各有自己的 Click 事件;即使两者执行完全相同的功能,您也必须在事件处理程序中分别为它们编写代码。

' Visual Basic 6.0 
Private Sub HelpButton_Click()
    HelpButton.Caption = "Help me!"
End Sub
Private Sub HelpMenu_Click()
    HelpMenu.Caption = "Help me!"
End Sub

在 Visual Basic 2008 中,事件通过委托关联到事件处理程序,使您能够为多个对象创建一个事件处理程序。

Private Sub HelpButton_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles HelpButton.Click, HelpMenu.Click
    sender.Text = "Help me!"
End Sub

请注意,上面示例中的事件声明包含一个定义将处理哪些事件的 Handles 子句——在本例中,要处理 HelpButton 和 HelpMenu 这两个对象的 Click 事件。这些对象和事件不必属于同一类型;例如,可能有一个事件处理程序,该程序处理按钮的 Click 事件、文本框的 DoubleClick 事件和计时器的 Tick 事件。

还请注意该事件声明包含以下两个参数:ByVal sender As Object 和 ByVal e As System.EventArgs。第一个参数 sender 提供对引发事件的对象的引用。第二个参数 e 传递特定于要处理的事件的对象。通过引用对象的属性(有时引用其方法)可获得一些信息,如鼠标事件中鼠标的位置或拖放事件中传输的数据。

在下面的示例中,MouseDown 事件处理程序使用 sender 参数确定生成事件的对象的类型,如果该对象为 PictureBox,则使用 e 参数将标签移动至发生单击的位置。若要重复此示例,请将两个 PictureBox 控件和一个 Label 控件添加到窗体中。

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, _
PictureBox1.MouseDown, PictureBox2.MouseDown

    If TypeOf sender Is PictureBox Then
        Label1.Location = sender.Location + e.Location
    Else
        MsgBox("Please click a picture")
    End If
End Sub

通常每个事件产生的事件处理程序的第二个参数都会使用不同的事件对象类型。一些事件处理程序(如 MouseDown 和 MouseUp 事件的事件处理程序)对于其第二个参数具有相同的对象类型 (MouseEventArgs)。对于这些类型的事件,可使用相同的事件处理程序处理这两个事件。

对于传递不同事件对象类型的事件,必须创建单独的事件处理程序。例如,TextBox 控件的 TextChanged 事件传递泛型 EventArgs 事件对象,而 MouseDown 事件传递更为专用的 MouseEventArgs 事件对象。MouseEventArgs 对象包含特定于鼠标事件的属性(如确定按下了哪个鼠标按钮的 Button);这些属性不适用于 TextBox 控件,如果尝试引用它们则会导致错误。

除了事件处理中的概念差异之外,Visual Basic 2008 中各种对象的一些事件的名称和行为也不相同。有关更多信息,请参见 适用于 Visual Basic 6.0 用户的 Windows 窗体控件

请参见

概念

事件处理程序概述(Windows 窗体)

其他资源

在 Windows 窗体中创建事件处理程序