2009-07-28 112 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事件無論多少行選擇或取消選擇。