-
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会导致的一些问题。
出处:https://www.cnblogs.com/farrio/archive/2005/03/16/119776.html
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会导致的一些问题。
出处:https://www.cnblogs.com/farrio/archive/2005/03/16/119776.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式