在 ListView 控件上,我需要在选择更改后触发一个事件,但每个用户操作仅触发一次。如果我只是使用 SelectedIndexChanged,则该事件在大多数情况下会触发两次(一次是在取消选择前一个元素时触发,另一次是在选择新元素时触发)如果用户仅单击控件一次事件。
这两个事件相继快速触发,但是当选择更改时我所做的计算需要时间(几乎一秒),因此会执行两次并减慢界面速度。
我想做的是每个用户操作只执行一次(在选择新元素之前执行此操作是无用的),但我无法知道该事件是否只是一对中的第一个(以便跳过第一个计算)因为如果用户刚刚取消选择所选元素,它只会触发一次。
我无法使用 Click 或 MouseClick 事件,因为如果用户在列表外部单击以删除选择,这些事件根本不会触发。
感谢您的帮助。
最佳答案
这是我在 VB.NET 中的解决方案,使用 ObjectListView 中描述的技术根据Grammarian的建议:
Private idleHandlerSet As Boolean = False
Private Sub listview1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listview1.SelectedIndexChanged
'' may fire more than once
If Not idleHandlerSet Then
idleHandlerSet = True
AddHandler Application.Idle, New EventHandler(AddressOf listview1_SelectionChanged)
End If
End Sub
Private Sub listview1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
'' will only fire once
idleHandlerSet = False
RemoveHandler Application.Idle, New EventHandler(AddressOf listview1_SelectionChanged)
DoSearch()
End Sub
关于.NET ListView : event after changing selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191920/