【发布时间】:2020-05-31 06:22:06
【问题描述】:
为什么事件处理程序在创建对象时不响应事件
当我尝试以与预期的方式引发和处理私人事件相同的方式引发私人事件时
Public Class Form1
Dim WithEvents nClass As Class1
Private Sub nClass_Created(ByVal sender As Object, ByVal e As System.EventArgs) Handles nClass.Created
MessageBox.Show("Created !")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
nClass = New Class1
End Sub
End Class
Public Class Class1
Event Created(ByVal sender As Object, ByVal e As EventArgs)
Sub New()
'some codes
'when finish
RaiseEvent Created(Me, New EventArgs)
End Sub
End Class
【问题讨论】:
-
因为您订阅了该类的不同实例。
nClass = New Class1将创建Class1类型的新实例,但您订阅了另一个实例的事件。 -
事件引发的真正原因是什么?如果您解释原因,也许您会找到解决问题的正确方法。
-
您需要引用一个对象才能处理该对象的事件,因此处理尚未创建的对象的事件完全没有意义。请解释您要实现的目标,而不是您要如何实现它。不管是什么,它都不会涉及在构造函数中引发事件。特别是关于您的代码,您已经知道对象是何时创建的,因为您正在创建它。为什么需要对象告诉您您只是做了您所做的事情?
-
@Fabio,问题不在于订阅是针对不同的实例。问题是在设置字段之前根本没有实例,这是在构造函数完成之后,因此在引发事件之后。您的建议将是第二次和以后单击按钮时的情况,但不是第一次。
-
这个过程收集了一些数据和统计数据,然后将它们作为其余应用程序部分的启动点传递,不需要保存在内存中或再次调用它们,通常我使用 `Sub New 传递它们(ByRef `,但是当我尝试使用事件传递它们时,我遇到了这个问题,那么为什么来自 `Sub New` 的引发事件可以在其类内部处理而不幸的是不能从外部处理!
标签: vb.net event-handling raiseevent