65.9K
CodeProject 正在变化。 阅读更多。
Home

在 VB.NET 中向类添加自定义事件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (12投票s)

2011 年 7 月 21 日

CPOL

2分钟阅读

viewsIcon

103924

downloadIcon

3265

在类中添加自定义事件。

引言

本文演示了如何在 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
© . All rights reserved.