一个子包含多个事件

时间:2018-08-14 19:52:21

标签: vb.net events

我在VB.NET中编写的使用AddHandler / RemoveHandler令牌的代码有问题。

这是我编写的代码:

Private Sub Remove_Handler()
    RemoveHandler txtSearch.TextChanged, AddressOf Ricarica_elenco
    RemoveHandler cbAttori.SelectedIndexChanged, AddressOf Ricarica_elenco
    RemoveHandler cbGeneri.SelectedIndexChanged, AddressOf Ricarica_elenco
    RemoveHandler cb_plex.CheckStateChanged, AddressOf Ricarica_elenco

End Sub

Private Sub Add_Handler()
    AddHandler txtSearch.TextChanged, AddressOf Ricarica_elenco
    AddHandler cbAttori.SelectedIndexChanged, AddressOf Ricarica_elenco
    AddHandler cbGeneri.SelectedIndexChanged, AddressOf Ricarica_elenco
    AddHandler cb_plex.CheckStateChanged, AddressOf Ricarica_elenco

End Sub

Private Sub Ricarica_elenco(sender As Object, e As EventArgs)

    CreaElenco()
End Sub

我有4个事件处理一个子例程。执行完“ Add_Handler”子程序后,如果同时发生两个或多个指示的事件,则子程序“ Ricarica_Elenco”将执行几次。

我需要创建一个自定义事件(或其他方式),该事件将收集4个原始事件并仅在两个或多个事件同时发生时才执行一次“ Ricarica_Elenco”过程。

我该怎么办?

谢谢

马塞洛(Marcello)

2 个答案:

答案 0 :(得分:1)

事件不会同时发生。可能是在 CreaElenco 方法中,您执行的操作触发了另一个对 CreaElenco 的调用,例如修改了 txtSearch 的文本或修改了的当前索引> cbAttori
这足以触发对关联事件处理程序的调用,并在您仍在处理对 CreaElenco 的第一次调用时,级联调用 CreaElenco 。一个简单的解决方案是在输入 CreaElenco 方法之前删除处理程序,并在完成后读取它们。当然,您应该确保始终读取 CreaElenco 方法内发生的所有处理程序。可以在删除处理程序的代码周围添加Try / Finally子句来实现。

for mod in dynamods
    dynamods[mod].execute()

答案 1 :(得分:0)

一种解决方法是创建一个 static 布尔变量,该变量指示该方法是否正在运行:

Private Sub Ricarica_elenco(sender As Object, e As EventArgs)
    Static currentlyRunning As Boolean
    If currentlyRunning Then Exit Sub

    currentlyRunning = True
    CreaElenco()
    currentlyRunning = False
End Sub

如果愿意,还可以将静态变量替换为类级变量。