我创建了一个继承类的对象。其中一个事件是触发列表中的更改。我试着写一个例子,但我发现放下逻辑要容易得多。通过"事件被提出",我的意思是 Private Sub RequestReceived(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.RequestReceived
'RequestReceived is from the Base Class
Dim requestType As String = sender
If requestType = "Type1" Then
RequestIsVariantOne(sender)
Else Then
'Handle other variants similarly
End If
End Sub
Private Sub RequestIsVariantOne(ByVal sender As Object)
'Conditional statements go here that determine whether or not to edit the list
'The statements will exit the Sub if it the list should not be edited.
'If Sub hasn't exited yet, now we edit the list.
ThatList.Add(sender)
'ListChanged is from the Inherited class
RaiseEvent ListChanged(ThatList, Nothing)
End Sub
。这也是我第一次使用自定义事件和可继承的类。
我试图避免从继承的类编辑GUI。问题是事件永远不会触发(它忽略了步骤5中的RaiseEvent,并且GUI永远不会发生事件)。可能单独的线程是个问题吗?
步骤5的示例:
resource
答案 0 :(得分:0)
Private Sub ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripMenuItem.Click
Dim rT As New Threading.Thread(AddressOf ListenerThread)
rT.Start()
End If
End Sub
Private Sub ListenerThread()
r = New RequestListener()
*r.Listen()*
End Sub
在星号中,这是关键因素。最初,它是从继承类的构造函数调用的。这意味着从未返回到GUI,我的类级变量从未更新过。因此,对RequestListener
(特别是事件)的任何引用都不会触发,因为RequestListener
是Nothing 。从GUI调用它解决了r IS Nothing
问题。
我通过创建一个手动提升事件的按钮来发现这一点,但是受到了NullReferenceException
的欢迎。一旦我从GUI启动了我的监听器,就会触发处理我的自定义事件的方法。我认为这解决了我的问题,但需要更多的工作。