vb.net如何订阅另一个类上的事件
我从网络上复制了事件示例并试图修改它,在这个示例中,我有win表单和两个类,表单有一个标签,它应该在事件触发器上更新。在第三节课上引发的事件,我想知道如何从表单订阅第三节课中的事件 这是一个表单类,它已订阅小部件类中的PercentDone事件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
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
处理的自己的事件公共类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