我有一个WinForms类,它提供了一些网络节点的TreeView。我有一个独立的模块,可以与网络连接,并检测何时添加或删除节点。我希望模块在网络发生变化时触发TreeView。
实施例
Public Class Main
Friend Sub TV_Main_Network_Click ( ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles TV_Main_Network.Enter, TV_Main_Network.Click
End Sub
End Class
Module Monitor
Friend Sub Test()
TV_Main_Network_Click()
End Sub
End Module
有两个问题:
TV_Main_Network_Click
”我也试过
RaiseEvent TV_Main_Network.Click
但这会产生错误:
TV_Main_Network_Click
不是.Monitor的事件
答案 0 :(得分:4)
我会通过在模块中创建一个公共事件来处理这个问题:
Public Event ChangeOccured(<variables to let the node class know what is going on>)
然后在声明节点类时,你应该将网络对象传递给它byref并在新函数中添加一个处理程序:
AddHandler NetworkModule.ChangeOccured, Addressof HandlingFunction
你当然需要创建这样的功能:
Private Sub HandlingFunction(<same params as in the ChangeOccured event declaration>)
<code>
End Sub
~~~~~~~~~~~~~~~~~~~~~~~~~编辑1 ~~~~~~~~~~~~~~~~~~~~ ~~~~~~~
如果你的文件系统观察者模块还不是一个类,我会考虑把它作为一个。
~~~~~~~~~~~~~~~~~~~~~~~~~编辑2:11/23/2009 3:30 PM ~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
我在上面显示的.NET中创建和使用自定义事件有四个步骤。我会在这里为你打破它们:
步骤1:在类中声明自定义事件,以便其他代码可以锁定它并为其创建处理程序。
Public Event ChangeOccured(<variables to let the node class know what is going on>)
第2步:实际上让你的类举起事件,以便附加到它的任何东西都被触发。
RaiseEvent ChangeOccured(<variables of the same type declared in step 1 go here>)
步骤3:在事件触发时,需要在类外(在需要的任何地方)创建一个函数。
Private Sub HandlingFunction(<same params as in the ChangeOccured event declaration>)
<code>
End Sub
步骤4:将函数附加到从其他类引发的事件中。您可以在formload上或在实例化类之后执行此操作。
AddHandler NetworkModule.ChangeOccured, Addressof HandlingFunction
在了解它究竟是什么后,它真的是一个简单的过程。一旦你理解了这四个步骤,你就会开始意识到所有.NET表单对象实际上都是用这种方式编写的,并且你可以用事件处理程序和表单对象做很多技巧,否则你就无法做到。 / p>
答案 1 :(得分:0)
好吧,另一个答案是正确的,但毫无根据。 因此,如果您希望跨班级收到一个事件,那么您就是这么做的。
示例:您有一个带有按钮的表单类,该按钮可启动自定义计时器类。您希望表单类接收此类中发生的每个滴答事件...
因此对于表单类,它看起来像这样。
Public Class FRM_TIMETICK
Dim TIMER_INSTANCE As New TIMETICK 'SPECIALTY TIMER CLASS INSTANCE.
Private Sub BTN_START_TIMER_Click(sender As Object, e As EventArgs) Handles BTN_START_TIMER.Click
TIMER_INSTANCE.START_TIMER(2000) 'FUNCTION WITHIN THE CLASS THAT STARTS THE TIMER.
AddHandler TIMER_INSTANCE.TICK, AddressOf TICK 'ADD A HANDLER TO PICK UP ON THE TICK EVENTS INSIDE THE CLASS,
'THE "AddressOf TICK" DIRECTS THE HANDLER TO THE FUNCTION/SUB TO EXECUTE.
End Sub
Private Sub TICK()
'CODE TO EXECUTE ON EACH TIMER TICK.
End Sub
然后在发生事件的班级里……
Public Class TIMETICK
Dim TIMER As New Timers.Timer 'THE TIMER TO BE DETECTED BY THE OUTSIDE CLASS.
Public Event TICK()
Public Function START_TIMER(ByVal INTERVAL_mS As UInteger, Optional ByVal AUTO_RESET As Boolean = True) As Boolean
With TIMER
.Interval = INTERVAL_mS
'SET THE INTERVAL IN MILLISECONDS.
.AutoReset = AUTO_RESET
'^TRUE MAKES THE TIMER LOOP INDEFINITLY, FALSE WONT LOOP.
.Enabled = True
'^ENABLE THE CONTROL.
AddHandler .Elapsed, New ElapsedEventHandler(AddressOf TIMER_TICK)
'^CREATE A HANDLE FOR EVERY TICK OF THE TIMER.
.Start()
End With
Return True
End Function
Private Sub TIMER_TICK(SENDER As Object, E As ElapsedEventArgs)
RaiseEvent TICK()
End Sub
希望这对遇到此问题的其他人有所帮助。