【问题标题】:How to raise an event when object created创建对象时如何引发事件
【发布时间】: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


【解决方案1】:

从逻辑上讲,这个概念是错误的。为了引发事件,必须有一个附加到事件的事件处理程序。为了附加处理程序,对象必须存在。为了存在,构造函数必须完成。您将永远无法让构造函数引发事件,因为在构造函数运行时委托列表将为空(不会添加任何处理程序)

这在 C# 中会更容易看到,这就是我们将事件附加到事物的方式:

var thing = new Thing();
thing.Event += new EventHandler(NameOfSomeMethod);

VB 也有类似的结构:

Dim thing as New Thing()
AddHandler(thing.Event, AddressOf(NameOfSomeMethod))

如您所见,必须先构建事物。构造函数代码当然可以调用事件,但不会附加任何处理程序,因此不会发生任何事情

如果您想在每次创建对象时收到通知,请使用工厂模式;构造您的类的类可以引发该类已创建的事件

【讨论】:

  • 我不认为 OP 希望收到有关每个创建实例的通知,但他们似乎想知道何时将新实例分配给 nClass。这可以通过制作nClass Private 并提供Property Let 来更改它可以引发事件来完成。 (不能直接转成属性,因为是WithEvents。)
  • 我无所谓;只是认为您可以将其添加到您的末尾,否则这是非常正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2015-09-24
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多