在 VB.NET 中向类添加自定义事件
在类中添加自定义事件。
引言
本文演示了如何在 VB.NET 中向类添加自定义事件,并在您的代码中使用它。
2010 年 1 月,我用阿拉伯语写了一篇文章,介绍了如何在 VB.NET 中处理自定义事件,无论是在类中还是在组件/控件中。我希望与 CodeProject 的同事们分享相同的想法。这可能对某人有所帮助。
背景
根据 MSDN 的说法,要处理一个或多个事件,应遵循以下步骤:
- 在类中定义一个委托集合,用于引发事件。
- 为每个事件定义一个键。
- 在引发事件的类中定义事件属性。
- 使用委托集合来实现事件属性的添加和删除访问器方法。
- 使用
public
事件属性来添加和删除处理事件的事件处理程序委托。
实际上,在类中添加或处理 Public
事件非常简单,但使用类处理自定义事件略有不同,因为它需要一个委托列表,例如 EventHandlerList
类,您需要在其中存储自定义事件。
为什么使用自定义事件
- 避免阻塞,重要的是一个
EventHandler
不阻塞后续的EventHandlers
。 - 节省内存,因为自定义事件允许应用程序仅为它处理的事件使用内存。
在组件/控件中处理自定义事件
在组件/控件中处理自定义事件是一项简单而直接的工作,以下步骤显示了如何执行此操作。
- 定义事件以使用委托存储,只需为其指定一个合适的唯一名称即可。
Public Custom Event AnyName As EventHandler AddHandler(ByVal value As EventHandler) End AddHandler RemoveHandler(ByVal value As EventHandler) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) End RaiseEvent End Event
- 将委托添加到组件的
EventHandlerList
。请注意,您必须为每个事件使用唯一的字符串。Public Custom Event AnyName As EventHandler AddHandler(ByVal value As EventHandler) Me.Events.AddHandler("AnyNameEvent", value) End AddHandler RemoveHandler(ByVal value As EventHandler) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) End RaiseEvent End Event
- 从组件的
EventHandlerList
中删除委托。Public Custom Event AnyName As EventHandler AddHandler(ByVal value As EventHandler) Me.Events.AddHandler("AnyNameEvent", value) End AddHandler RemoveHandler(ByVal value As EventHandler) Me.Events.RemoveHandler("AnyNameEvent", value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) End RaiseEvent End Event
- 引发事件。
Public Custom Event AnyName As EventHandler AddHandler(ByVal value As EventHandler) Me.Events.AddHandler("AnyNameEvent", value) End AddHandler RemoveHandler(ByVal value As EventHandler) Me.Events.RemoveHandler("AnyNameEvent", value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) CType(Me.Events("AnyNameEvent"), EventHandler).Invoke(sender, e) End RaiseEvent End Event
- 编写调用事件的方法,然后您可以根据需要使用它。
Imports System.ComponentModel Public Class CustomEventComponent_Sample Inherits Component ' Define the Click event to use the delegate store. Public Custom Event AnyName As EventHandler AddHandler(ByVal value As EventHandler) ' Add the delegate to the Component's EventHandlerList Collection Me.Events.AddHandler("AnyNameEvent", value) End AddHandler RemoveHandler(ByVal value As EventHandler) ' Remove the delegate from the Component's EventHandlerList Collection Me.Events.RemoveHandler("AnyNameEvent", value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) ' Raise the event. CType(Me.Events("AnyNameEvent"), EventHandler).Invoke(sender, e) End RaiseEvent End Event ' Write the method to call the Event, and then use it as you want. Protected Sub OnAnyName(ByVal e As EventArgs) Dim anyNameHandler As EventHandler = _ CType(Me.Events("AnyNameEvent"), EventHandler) If (anyNameHandler IsNot Nothing) Then anyNameHandler.Invoke(Me, e) End If End Sub End Class
在类中处理自定义事件
要在任何类中处理自定义事件,我们只需要一个集合来存储委托,例如,您可以使用 Hashtable
类或 ArrayList
类或任何类似的集合,甚至可以使用 EventHandlerList
类。
以下步骤定义了如何在类中处理自定义事件以及如何释放它。
- 定义您的类并实现
IDisposable
接口。Public Class ThemeColors Implements IDisposable ' rest of the code goes here End Class
- 定义一个集合来存储委托。
Private _events As EventHandlerList = Nothing Protected ReadOnly Property Events() As EventHandlerList Get If _events Is Nothing Then _events = New EventHandlerList() End If Return _events End Get End Property
- 如上所述,定义事件以使用委托存储,将委托添加到
EventHandlerList
,从EventHandlerList
中删除委托,最后引发事件,最后编写调用事件的方法。#Region " Events " Public Custom Event ThemeChanged As EventHandler AddHandler(ByVal value As EventHandler) Me.Events.AddHandler("ThemeChangedEvent", value) End AddHandler RemoveHandler(ByVal value As EventHandler) Me.Events.RemoveHandler("ThemeChangedEvent", value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) CType(Me.Events("ThemeChangedEvent"), EventHandler).Invoke(sender, e) End RaiseEvent End Event #End Region #Region " Methods " Protected Overridable Sub OnThemeChanged_ (ByVal sender As Object, ByVal e As EventArgs) Dim handler As EventHandler = _ CType(Me.Events("ThemeChangedEvent"), EventHandler) If (handler IsNot Nothing) Then RaiseEvent ThemeChanged(sender, e) End If End Sub #End Region
在集合中处理自定义事件
无需添加,只需以相同的方式操作即可..................
Imports System.ComponentModel
Public Class CollectionWithEvents
Inherits CollectionBase
#Region " Fields "
Private _events As EventHandlerList = Nothing
#End Region
#Region " Properties "
Protected ReadOnly Property Events() As EventHandlerList
Get
If _events Is Nothing Then
_events = New EventHandlerList()
End If
Return _events
End Get
End Property
#End Region
#Region " Methods "
Protected Overridable Sub OnThemeChanged(ByVal sender As Object, _
ByVal e As EventArgs)
Dim handler As EventHandler = _
CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
RaiseEvent ThemeChanged(sender, e)
End If
End Sub
#End Region
#Region " Events "
Public Custom Event ThemeChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("ThemeChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("ThemeChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("ThemeChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
#End Region
End Class
Using the Code
下载附带的源代码,其中显示了如何处理自定义事件……享受吧!
历史
- 首次发布,2011 年 7 月 21日