2009-07-28 117 views
4

在ListView控件上,我需要在选择更改后触发事件,但每个用户操作只需触发一次。如果我只是在大多数情况下使用的SelectedIndexChanged,该事件触发两次(一次当上一个元素是选择,而当新的元素被选择一次以上)事件,如果用户只在控制一次点击。.NET ListView:更改选择后的事件

两个事件火势迅速一前一后,但选择何时更改,需要一定的时间(几乎是第二个),所以它是做两次,减慢界面我做计算。

我想要做的只是每个用户操作执行一次(在选择新元素之前这样做是无用的),但我无法知道事件是否仅仅是一对中的第一个(为了跳过第一次计算),因为如果用户刚刚取消选定的元素,它将只触发一次。

我不能用点击鼠标点击或事件,因为那些不火,在所有如果用户点击列表外取消选择。

感谢您的帮助。

回答

2

这是我在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 
-2

如果你想如果选择新项目的计算来运行,您可以检查是否新的SelectedIndex是!= -1

+0

不,我不希望出现这种情况,这是明确的部分的最后一段说。 – Laurent 2009-07-28 08:33:54

+1

不,不是。最后一段谈到Click和MouseClick。 如果您检查SelectedIndex == -1是否意味着取消选择。当SelectedIndex再次> = 0时,您将开始计算。 – EricSchaefer 2009-07-28 16:14:26

+0

是的,但这与仅使用Click事件(在SelectedIndex = -1时不触发)完全相同。当我说“因为如果用户删除选择不会触发”,这可能意味着即使没有选择新项目,我也需要它运行! – Laurent 2009-07-29 04:52:56

3

我发现这个讨厌的了,所以在ObjectListView(一个开源包装器.NET WinForms ListView)有一个SelectionChanged事件,每个用户操作只发生一次。

采用了直板.NET ListView控件,当任何项目的选择状态的变化,它会触发一个SelectedIndexChanged事件。因此,为了简单点击另一行,您将获得一个用于取消选择之前选定行的事件,另一个用于选择新行。

如果你选择了一个几百行,并选择了不同的行,你会得到101个的SelectedIndexChanged事件 - 它可以是一个皇家疼痛。

无论如何,与ObjectListView,你只能得到一个SelectionChanged事件无论多少行选择或取消选择。