.NET ListView:更改选择后的事件
在ListView控件上,我需要在选择更改后触发事件,但每个用户操作只需触发一次。如果我只是在大多数情况下使用的SelectedIndexChanged,该事件触发两次(一次当上一个元素是选择,而当新的元素被选择一次以上)事件,如果用户只在控制一次点击。.NET ListView:更改选择后的事件
两个事件火势迅速一前一后,但选择何时更改,需要一定的时间(几乎是第二个),所以它是做两次,减慢界面我做计算。
我想要做的只是每个用户操作执行一次(在选择新元素之前这样做是无用的),但我无法知道事件是否仅仅是一对中的第一个(为了跳过第一次计算),因为如果用户刚刚取消选定的元素,它将只触发一次。
我不能用点击鼠标点击或事件,因为那些不火,在所有如果用户点击列表外取消选择。
感谢您的帮助。
这是我在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
如果你想如果选择新项目的计算来运行,您可以检查是否新的SelectedIndex是!= -1
我发现这个讨厌的了,所以在ObjectListView(一个开源包装器.NET WinForms ListView)有一个SelectionChanged事件,每个用户操作只发生一次。
采用了直板.NET ListView控件,当任何项目的选择状态的变化,它会触发一个SelectedIndexChanged事件。因此,为了简单点击另一行,您将获得一个用于取消选择之前选定行的事件,另一个用于选择新行。
如果你选择了一个几百行,并选择了不同的行,你会得到101个的SelectedIndexChanged事件 - 它可以是一个皇家疼痛。
无论如何,与ObjectListView,你只能得到一个SelectionChanged事件无论多少行选择或取消选择。
不,我不希望出现这种情况,这是明确的部分的最后一段说。 – Laurent 2009-07-28 08:33:54
不,不是。最后一段谈到Click和MouseClick。 如果您检查SelectedIndex == -1是否意味着取消选择。当SelectedIndex再次> = 0时,您将开始计算。 – EricSchaefer 2009-07-28 16:14:26
是的,但这与仅使用Click事件(在SelectedIndex = -1时不触发)完全相同。当我说“因为如果用户删除选择不会触发”,这可能意味着即使没有选择新项目,我也需要它运行! – Laurent 2009-07-29 04:52:56