首页 > 解决方案 > 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

标签: vb.netevents

解决方案


在一般情况下,一个类A的实例创建一个类的实例,然后B创建一个类的实例C,然后你想A响应一个事件C,你有三个选择:

  1. B传递A一个引用C,然后A正常处理该事件。
  2. A为事件创建一个委托并将其传递给B,后者将其附加到事件。
  3. 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

推荐阅读