vb.net如何订阅另一个类上的事件

vb.net如何订阅另一个类上的事件,vb.net,events,Vb.net,Events,我从网络上复制了事件示例并试图修改它,在这个示例中,我有win表单和两个类,表单有一个标签,它应该在事件触发器上更新。在第三节课上引发的事件,我想知道如何从表单订阅第三节课中的事件 这是一个表单类,它已订阅小部件类中的PercentDone事件 Imports System.Threading Imports Microsoft.VisualBasic.DateAndTime Imports System.Threading Public Class Form1 Private Wit

我从网络上复制了事件示例并试图修改它,在这个示例中,我有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
公共类小部件
公共事件完成百分比(ByVal百分比为单个,
ByRef取消为布尔值)
公共子任务(ByVal持续时间为单个,
ByVal最小中间值(单个)
将阈值设置为单个
单程启动
作为布尔值的Dim blnCancel
Console.WriteLine(“小部件线程=&Thread.CurrentThread.Name”)
'DateAndTime对象的计时器属性返回秒数
“还有从午夜开始的几毫秒。
Start=CSng(Microsoft.VisualBasic.DateAndTime.Timer)
阈值=最小间隔
Do While CSng(Microsoft.VisualBasic.DateAndTime.Timer)<(开始+持续时间)
“在实际应用中,某些工作单元会
“每次通过循环都要在这里完成。
如果CSng(Microsoft.VisualBasic.DateAndTime.Timer)>(开始+阈值),则
提高成功率(
阈值/持续时间,blnCancel)
'检查操作是否已取消。
如果blnCancel,则退出Sub
阈值=阈值+最小间隔
如果结束
环
端接头
末级

在一般情况下,如果类
A
的实例创建类
B
的实例,并且创建类
C
的实例,那么您希望
A
响应
C
中的事件,您有三个选项:

  • B
    A
    引用传递到
    C
    ,然后
    A
    正常处理事件
  • A
    为事件创建一个委托,并将其传递给
    B
    ,后者将其附加到事件
  • B
    处理
    C
    中的事件,并引发由
    A
    处理的自己的事件
  • 我将提供每个案例的示例

    案例1的示例:

    公共类ClassA
    以事件c作为类c的私有
    私有子c_somethingOccessed(发送方作为对象,e作为事件参数)处理c.somethingOccessed
    '...
    端接头
    私有子CreateB()
    将b作为新类b
    c=b.c
    端接头
    末级
    公共B类
    C类公共财产
    公共分新()
    C=新类别C()
    端接头
    末级
    公共类C类
    公共事件作为事件处理程序发生了一些事情
    末级
    
    案例2的示例:

    公共类ClassA
    出现私有子HandleSomething(发送方作为对象,e作为事件参数)
    '...
    端接头
    私有子CreateB()
    尺寸b作为新的b类(出现无把手的东西的地址)
    端接头
    末级
    公共B类
    私有c作为新的ClassC
    Public Sub New(作为事件处理程序的SomethingHappendHandler)
    发生了什么事,发生了什么事
    端接头
    末级
    公共类C类
    公共事件作为事件处理程序发生了一些事情
    末级
    
    案例3的示例:

    公共类ClassA
    Private将事件b作为新类b
    私有子b_somethingOccessed(发送方作为对象,e作为事件参数)处理b.somethingOccessed
    '...
    端接头
    末级
    公共B类
    Private将事件c作为新类c
    公共事件作为事件处理程序发生了一些事情
    私有子c_somethingOccessed(发送方作为对象,e作为事件参数)处理c.somethingOccessed
    OnSomething出现(EventArgs.Empty)
    端接头
    某个事件上出现的受保护的可重写子事件(e作为事件参数)
    发生了什么事(我,e)
    端接头
    末级
    公共类C类
    公共事件作为事件处理程序发生了一些事情
    末级
    
    首先,请提供一个示例,强调本例中的“最小值”。要证明你的问题,还有很多方法。所有与你的问题无关的事情都会让我们更难回答,从而更耗时。这浪费了我们的时间,也降低了我们回答问题的可能性,这对您不利。另外,请提供一个完整、清晰的问题解释。类的数量是不相关的。重要的是对象之间的关系。我猜想你是说,没有说你有一个类A,它创建了一个类B的实例,也创建了一个类C的实例,那么你想让A对象处理一个由C对象引发的事件。这是正确的吗?这段代码是否包含您在做同一件事时的两次不同尝试?Testclass似乎unnecessary@jmcilhinney是的,这就是我想做的。
    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