vb.net - vb.net 如何订阅另一个类的事件
问题描述
我从网上复制了事件示例并尝试对其进行修改,在此示例中,我有 win 表单和两个类,表单有一个标签,它应该在事件触发时更新。在第三堂课上引发的事件,我想知道如何从表单订阅第三堂课中的事件。
这是一个表单类,它订阅了小部件类中的 PercentDone 事件
Imports System.Threading
Imports Microsoft.VisualBasic.DateAndTime
Imports System.Threading
Public Class Form1
Private WithEvents mWidget As widget
Private mblnCancel As Boolean
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
mWidget = New widget
End Sub
Private Sub mWidget_PercentDone(Percent As Single, ByRef Cancel As Boolean) Handles mWidget.PercentDone
If Me.lblPercentDone.InvokeRequired Then
Else
lblPercentDone.Text = CInt(100 * Percent) & "%"
End If
My.Application.DoEvents()
If mblnCancel Then Cancel = True
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
mblnCancel = True
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ct As New Testclass
mblnCancel = False
lblPercentDone.Text = "0%"
lblPercentDone.Refresh()
ct.Callsubclx()
' mWidget.LongTask(12.2, 0.33)
If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
End Sub
End Class
Imports System.Threading
Public Class Testclass
Public WithEvents mWidget As widget
Private mblnCancel As Boolean
Public Sub Callsubclx()
mblnCancel = False
Dim mWidget = New widget
mWidget.LongTask(12.2, 0.33)
End Sub
End Class
Public Class widget
Public Event PercentDone(ByVal Percent As Single,
ByRef Cancel As Boolean)
Public Sub LongTask(ByVal Duration As Single,
ByVal MinimumInterval As Single)
Dim Threshold As Single
Dim Start As Single
Dim blnCancel As Boolean
Console.WriteLine("Widget Thread=" & Thread.CurrentThread.Name)
' The Timer property of the DateAndTime object returns the seconds
' and milliseconds that have passed since midnight.
Start = CSng(Microsoft.VisualBasic.DateAndTime.Timer)
Threshold = MinimumInterval
Do While CSng(Microsoft.VisualBasic.DateAndTime.Timer) < (Start + Duration)
' In a real application, some unit of work would
' be done here each time through the loop.
If CSng(Microsoft.VisualBasic.DateAndTime.Timer) > (Start + Threshold) Then
RaiseEvent PercentDone(
Threshold / Duration, blnCancel)
' Check to see if the operation was canceled.
If blnCancel Then Exit Sub
Threshold = Threshold + MinimumInterval
End If
Loop
End Sub
End Class
解决方案
在一般情况下,一个类A
的实例创建一个类的实例,然后B
创建一个类的实例C
,然后你想A
响应一个事件C
,你有三个选择:
B
传递A
一个引用C
,然后A
正常处理该事件。A
为事件创建一个委托并将其传递给B
,后者将其附加到事件。B
处理中的事件C
并引发由 . 处理的自己的事件A
。
我将为每种情况提供一个示例。
案例一的例子:
Public Class ClassA
Private WithEvents c As ClassC
Private Sub c_SomethingHappened(sender As Object, e As EventArgs) Handles c.SomethingHappened
'...
End Sub
Private Sub CreateB()
Dim b As New ClassB
c = b.C
End Sub
End Class
Public Class ClassB
Public Property C As ClassC
Public Sub New()
C = New ClassC()
End Sub
End Class
Public Class ClassC
Public Event SomethingHappened As EventHandler
End Class
案例2示例:
Public Class ClassA
Private Sub HandleSomethingHappened(sender As Object, e As EventArgs)
'...
End Sub
Private Sub CreateB()
Dim b As New ClassB(AddressOf HandleSomethingHappened)
End Sub
End Class
Public Class ClassB
Private c As New ClassC
Public Sub New(somethingHappenedHandler As EventHandler)
AddHandler c.SomethingHappened, somethingHappenedHandler
End Sub
End Class
Public Class ClassC
Public Event SomethingHappened As EventHandler
End Class
案例 3 示例:
Public Class ClassA
Private WithEvents b As New ClassB
Private Sub b_SomethingHappened(sender As Object, e As EventArgs) Handles b.SomethingHappened
'...
End Sub
End Class
Public Class ClassB
Private WithEvents c As New ClassC
Public Event SomethingHappened As EventHandler
Private Sub c_SomethingHappened(sender As Object, e As EventArgs) Handles c.SomethingHappened
OnSomethingHappened(EventArgs.Empty)
End Sub
Protected Overridable Sub OnSomethingHappened(e As EventArgs)
RaiseEvent SomethingHappened(Me, e)
End Sub
End Class
Public Class ClassC
Public Event SomethingHappened As EventHandler
End Class