VB.NET里面的Event机制

自从VB6开始,Event这个东西就已经深入了VB系列程序中间。在VB6中,我们是简单的通过诸如TextBox1_TextChanged这样一个函数了解到当文字变化的时候,就能够自动触发这个函数。进入了.NET之后,是我们有幸第一次看到了Event的真面目。现在我们在VB.NET里面直接写入下面的函数
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub

看来是不能够达到VB6的效果的。原因是我们少写了Handles TextBox1.TextChanged。
这个就是真实存在的Event了。VB.NET对于Event终于可以脱离了函数名的限制(但是不是函数的全部限制),自由的使用。只要我们喜欢,我们也可以写成
    Private Sub ThisIsMyTextChangedMethod(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub

完全可以。
现在我们就来看看我们如何在自己的类里面加入我们需要的Event。

(1)首先我们需要一个类
Public Class Class1

    Inherits Object

End Class


(2)然后我们就可以在这个类里面加入我们的Event了。

Public Class Class1

    Inherits Object

    Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs)

End Class

Event里面是可以携带参数的。就好像TextChanged Event一样,他携带了sender和e。sender表示这个Event触发源的实例,也就是这个TextBox1;e是一个事件参数,我们可以将需要传达给使用的信息通过继承自EventArgs的类的实例来传递出去。而这里,EventArgs里面并没有什么有价值的信息。

现在这个类里面已经有了我们要的Event,但是这个Event仅仅是一个声明。也就是说,我们告诉编译器和使用者,Class1里面有一个叫做MyEvent的Event。我们的下一个步骤就是确定什么时候,我们要引发这个Event。

 

(3)引发Event的语句很简单。

RaiseEvent MyEvent(Me, New EventArgs)

但是值得我们注意的是,Event是不能凭空触发的。我的意思是,RaiseEvent也是一条VB语句,我们只能将这条语句写在Function、Sub或者Property里面。这就意味着我们的Event的触发,要么是通过别人调用了某一个方法,要么通过现在已经存在Handle Sub来触发。

现在我们使用第一种方法,我们通过一个Public函数来触发这个Event。

    Public Sub DoSomething()

        RaiseEvent MyEvent(Me, New EventArgs)

    End Sub

这就意味着,当用户调用了DoSomething方法的时候,Class1就会自动抛出一个MyEvent事件出来。

到这里,一个完整的Event就已经做完了。很简单吧。

 

(4)同样的方法,我们可以在一个Handle Sub里面抛出我们Event。

Public Class Class1

    Inherits Object

    Private WithEvents MyButton As New Button

    Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs)

    Private Sub MyButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton.Click

        RaiseEvent MyEvent(Me, New EventArgs)

    End Sub

End Class

这里我们同过一个WithEvents的成员MyButton的Click事件函数,触发我们自己的MyEvent事件。

 

(5)使用这个Class1,我们就可以看到我们自己做的这个MyEvent事件了。

Public Class Test

    Inherits Object

    Private WithEvents MyClass1 As Class1

    Private Sub MyClass1_MyEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyClass1.MyEvent

    End Sub

End Class

 

很简单吧,但是使用Event并不止如此。随后我们将会看到这样简单的使用Event会导致的一些问题。

现在我们看看下面的类。

Public Class Class1

    Inherits Object

    Private WithEvents MyButton As New Button

    Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs, ByRef Cancal As Boolean)

    Public Event MyExtendedEvent(ByVal sender As Object, ByVal e As EventArgs)

    Private Sub MyButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton.Click

        Dim blnCancel As Boolean = False

        RaiseEvent MyEvent(Me, New EventArgs, blnCancel)

        ExtendedCommand()

    End Sub

    Private Sub ExtendedCommand()

        RaiseEvent MyExtendedEvent(Me, New EventArgs)

    End Sub

End Class

我们定义了两个Event,一个是MyEvent,另一个是MyExtendedEvent。我们在Button.Click的时候,触发了我们的MyEvent,随后我们通过调用ExtendedCommand函数触发下一个Event。看来没有什么问题,用户在使用的时候,依照往常一样。

Public Class Test

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值