0

我正在尝试编写一些代码,这些代码将在我的一个对象中引发一个事件,然后在我的一个窗口窗体中处理该事件。它看起来很简单,但我无法让代码工作;程序创建人员对象,设置人员姓名,甚至引发事件但不处理表单代码中的事件。我已经将包含“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
4

2 回答 2

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
于 2013-03-22T20:18:44.273 回答
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有点永久性。如果要在应用程序的整个生命周期中使用它并且您希望能够使用智能感知,您会这样做。

于 2013-03-22T20:36:06.950 回答