2012-09-26 34 views
2

非常簡單的問題,當列表視圖的選定索引更改時,事件觸發兩次,一次取消選擇,第二次選擇下一個項目。避免列表視圖選擇索引已更改兩次觸發

我需要在不同的時間選擇或取消選擇時使用該事件,但是取消選擇只是稍後重新選擇它使得我的一半閃光燈從啓用開啓到關閉並再次開啓,這也導致公平的一點代碼運行,所以我只需要

戴夫r表示使用100ms的計時器在這裏避免了取消選擇射擊,如果它是被點擊的另一個項目,而不是空白空間(取消選擇)的一種方式:Am I missing something with my ListView selection event handling 這聽起來像它會起作用,但看起來相當凌亂或通常是一種不好的做法。

我唯一的想法是使用click事件,然後在該位置找到該項目?但我寧願不去麻煩

在此先感謝!

CNC中

我只是認爲點擊事件先觸發,所以我可以設定跳過選擇指數改變代碼,如果點擊事件發生在一個項目一個標誌,然後它的後重置該標誌因此被用於跳過取消選擇?我現在會看看,但又不覺得是一種非常有效或簡單的方法來做一些聽起來很簡單的事情?

+0

是啊只是改變標籤!最後一個問題是sql – Alex

+0

你讀過這個:http://www.pcreview.co。uk/forums/listview-selectedindexchanged-firing-twice-possible-solution-t2409685p2.html? –

回答

1

即使延遲1毫秒,以下解決方案也能正常工作。要確定它的工作原理可能可以選擇更高的延遲,例如10毫秒,但延遲100毫秒會使它在選擇「無」時有點遲緩。下面是C#-Code:

public class FixedListView : ListView 
{ 
    private Timer _ItemSelectionChangedTimer = new Timer(); 
    private Timer _SelectedIndexChangedTimer = new Timer(); 

    private ListViewItemSelectionChangedEventArgs _ItemSelectionChangedEventArgs; 
    private EventArgs _SelectedIndexChangedEventArgs; 

    public FixedListView() 
    { 
     this._ItemSelectionChangedTimer.Interval = 1; 
     this._SelectedIndexChangedTimer.Interval = 1; 

     this._ItemSelectionChangedTimer.Tick += (sender, e) => 
     { 
      this.OnItemSelectionChanged(this._ItemSelectionChangedEventArgs); 
      this._ItemSelectionChangedEventArgs = null; 
     }; 
     this._SelectedIndexChangedTimer.Tick += (sender, e) => 
     { 
      this.OnSelectedIndexChanged(this._SelectedIndexChangedEventArgs); 
      this._SelectedIndexChangedEventArgs = null; 
     }; 
    } 

    protected override void OnItemSelectionChanged(ListViewItemSelectionChangedEventArgs e) 
    { 
     if (this._ItemSelectionChangedTimer.Enabled) 
     { 
      this._ItemSelectionChangedTimer.Stop(); 
      base.OnItemSelectionChanged(e); 
     } 
     else 
     { 
      this._ItemSelectionChangedEventArgs = e; 
      this._ItemSelectionChangedTimer.Start(); 
     } 
    } 

    protected override void OnSelectedIndexChanged(EventArgs e) 
    { 
     if (this._SelectedIndexChangedTimer.Enabled) 
     { 
      this._SelectedIndexChangedTimer.Stop(); 
      base.OnSelectedIndexChanged(e); 
     } 
     else 
     { 
      this._SelectedIndexChangedEventArgs = e; 
      this._SelectedIndexChangedTimer.Start();     
     } 
    } 
} 

這裏是VB-代碼:

Public Class FixedListBox 

Inherits ListView 

Public Sub New() 

    Me._ItemSelectionChangedTimer.Interval = 1 
    Me._SelectedIndexChangedTimer.Interval = 1 

    AddHandler Me._ItemSelectionChangedTimer.Tick, _ 
     Sub(sender, e) 
      Me.OnItemSelectionChanged(Me._ItemSelectionChangedEventArgs) 
      Me._ItemSelectionChangedEventArgs = Nothing 
     End Sub 

    AddHandler Me._SelectedIndexChangedTimer.Tick, _ 
     Sub(sender, e) 
      Me.OnSelectedIndexChanged(Me._SelectedIndexChangedEventArgs) 
      Me._SelectedIndexChangedEventArgs = Nothing 
     End Sub 

End Sub 

Private _ItemSelectionChangedTimer As New Timer() 
Private _SelectedIndexChangedTimer As New Timer() 

Private _ItemSelectionChangedEventArgs As ListViewItemSelectionChangedEventArgs 
Private _SelectedIndexChangedEventArgs As EventArgs 

Protected Overrides Sub OnItemSelectionChanged(e As ListViewItemSelectionChangedEventArgs) 

    If Me._ItemSelectionChangedTimer.Enabled Then 

     Me._ItemSelectionChangedTimer.Stop() 
     MyBase.OnItemSelectionChanged(e) 

    Else 

     Me._ItemSelectionChangedEventArgs = e 
     Me._ItemSelectionChangedTimer.Start() 

    End If 

End Sub 

Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs) 

    If Me._SelectedIndexChangedTimer.Enabled Then 

     Me._SelectedIndexChangedTimer.Stop() 
     MyBase.OnSelectedIndexChanged(e) 

    Else 

     Me._SelectedIndexChangedEventArgs = e 
     Me._SelectedIndexChangedTimer.Start() 

    End If 

End Sub 

末級

您可以使用像一個正常的ListView但的SelectedIndexChanged和ItemSelectionChanged纔會觸發控制一旦。

玩得開心......

1

我只是嘗試另一種解決方案是有可能沒有任何延遲,它的工作對我來說:

If ListView1.Items(ListView1.FocusedItem.Index).Selected = False Then 
     'This is the deselected value 
     MsgBox("Deselected: " & ListView1.Items(ListView1.FocusedItem.Index).SubItems(0).Text) 
    Else 
     'This is the new selected value 
     MsgBox("Selected: " & ListView1.Items(ListView1.FocusedItem.Index).SubItems(0).Text) 
    End If 
+0

你得到的是倒退,但耶(改變爲真),這是一個更好的解決方案。試圖讓這個過程成爲一場絕對的噩夢。不知道爲什麼會得到這麼多票。此解決方案對於Compact Framework也很有用,因爲CF.NET 2.0沒有確定典型的事件參數 - e.IsSelected。 –

0

只是檢查在SelectedIndexChanged事件關注項目是否爲空,出口。

ListView^ item = listView1-> FocusedItem; //get selected item 
if (item == nullptr){return;) // this line exits when deselection event fires 
String^ data1 = Convert::ToString ( item-> SubItems [0] ); // get your data from columns like so 
MessageBox::Show (data1); // display 

請注意,您可以通過更改子項目 提供的指數,使用定時器抓下幾列數據和拖延只會招致開銷,尤其是對於大型數據庫導致您的應用程序在Visual C放緩代碼++ .NET但相同理論適用於C#和其他人

享受!

相關問題