VB.NET对象类事件无法正常工作

时间:2013-03-22 19:52:30

标签: vb.net events object handler

我正在尝试编写一些代码,这些代码会在我的一个对象中引发一个事件,然后在我的一个窗口窗体中处理。它似乎很简单,但我无法使代码工作;程序创建person对象,设置人名,甚至引发事件但不处理表单代码中的事件。我已经将包含'event'和'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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

看起来您想要使用不同的按钮反复使用该对象。如前所述,你重新宣布这个人,从而消除了它的处理程序。将来,如果您希望能够动态使用此类及其事件,则必须使用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有点永久。如果它将在应用程序的生命周期中使用并且您希望能够使用智能感知,那么您可以这样做。