我正在尝试编写一些代码,这些代码会在我的一个对象中引发一个事件,然后在我的一个窗口窗体中处理。它似乎很简单,但我无法使代码工作;程序创建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
答案 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
有点永久。如果它将在应用程序的生命周期中使用并且您希望能够使用智能感知,那么您可以这样做。