【问题标题】:VB.NET Object Class Event not workingVB.NET 对象类事件不起作用
【发布时间】:2013-03-22 19:52:30
【问题描述】:

我正在尝试编写一些代码,这些代码将在我的一个对象中引发一个事件,然后在我的一个窗口窗体中处理该事件。它看起来很简单,但我无法让代码工作;程序创建人员对象,设置人员姓名,甚至引发事件但不处理表单代码中的事件。我已经将包含“事件”和“raiseevent”的类代码复制到主程序中,但它仍然不起作用。我不确定问题是什么,但任何帮助将不胜感激。

代码是使用 VS Express 2012 IDE 软件在 VB.NET 中编写的。

Public Class clsPerson
  Private m_name As String
  Public Event personviewed()

  Public Property name() As String
    Get
      name = m_name
    End Get
    Set(value As String)
      m_name = value
    End Set
  End Property

  Public Sub personviewedmethod()
    RaiseEvent personviewed()
  End Sub
End Class

Public Class Form1
  Public WithEvents clsperson1 As clsPerson

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim clsperson1 As New clsPerson
    clsperson1.name = "PersonsName"
    clsperson1.personviewedmethod()
  End Sub

  Private Sub personviewed() Handles clsperson1.personviewed
    MessageBox.Show("***Event raised**")
  End Sub
End Class

【问题讨论】:

  • 您有两个 clsPerson 实例。具有 WithEvents 的那个从未被初始化。另一个是局部变量,没有订阅任何事件处理程序。摆脱局部变量。

标签: vb.net events object handler


【解决方案1】:

当你重新声明你的对象时,它是不一样的,而是完全初始化它,处理程序将按预期工作。

Public Class Form1
Public WithEvents clsperson1 As New clsPerson

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   'Dim clsperson1 As New clsPerson -do not re-declare the object
   clsperson1.name = "PersonsName"
   clsperson1.personviewedmethod()
 End Sub

 Private Sub personviewed() Handles clsperson1.personviewed
   MessageBox.Show("***Event raised**")
 End Sub
End Class

【讨论】:

  • 多娜,感谢您的帮助。我已经按照你自己和 Hans Passant 的建议更改了代码,现在代码可以正常工作了。再次感谢您的帮助。
【解决方案2】:

您似乎想通过不同的按钮反复使用该对象。如前所述,您正在重新声明此人,从而消除其处理程序。将来如果您希望能够动态使用此类及其事件,则必须使用AddHandler 将事件处理程序附加到新实例。

所以你得到了这个:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Dim clsperson1 As New clsPerson() 
       clsperson1.name = "PersonsName"
       AddHanlder clsperson1.personviewed, AddressOf personviewed
       clsperson1.personviewedmethod()
    End Sub

   Private Sub personviewed()
      MessageBox.Show("***Event raised**")
   End Sub
End Class

以这种方式声明,每次单击该按钮时都会创建一个新人,并且其事件的处理独立于所有其他人对象。

声明一个对象with events 有点永久性。如果要在应用程序的整个生命周期中使用它并且您希望能够使用智能感知,您会这样做。

【讨论】:

  • 是的,我认为你上面提到的解决方案非常好,我明天可能会看看。我在 WEB 站点上看到过这种方法用于类似的问题,但我认为我会先尝试静态(“更简单”)的方式。我不认为我会遇到任何我自己解决不了的问题。无论如何,感谢您回答我的问题并提出另一种解决问题的方法。
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2018-11-22
相关资源
最近更新 更多