2011-04-21 105 views
4

基本上,我有一個ListView的項目。選擇一個時,右側會顯示一個文本框以顯示該項目的更多詳細信息(需要一點時間才能抓取項目數據)。我想要的行爲是當所有項目被取消選中時,將此文本框隱藏在右側。捕獲在ListView中取消所有選擇 - SelectedIndexChanged兩次觸發

 private void listView1_SelectedIndexChanged(object sender, EventArgs e) { 

      // should only be 1 item selected, it's not a multi-select listview 
      ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems; 

      if (collection.Count == 0) { 
       this.label2.Visible = false; 
      }  
      foreach (ListViewItem item in collection) { 
       this.label2.Visible = true; 
       getSideInformation(item.Text); 
      } 
     } 

當我簡單地選擇另一個項目時,我注意到了閃爍的框。

 private void listView1_SelectedIndexChanged(object sender, EventArgs e) { 

      // should only be 1 item selected, it's not a multi-select listview 
      ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems; 

      if (collection.Count == 0) { 
       this.label2.Text = "Unselected all!"  
      } 
      foreach (ListViewItem item in collection) { 
       getSideInformation(item.Text); 
      } 
     } 

基本上,我不再隱藏框,但只是改變了文本,如果它與選擇0項的選擇更改事件:我改變我的代碼做一些挖掘。我發現這個事件實際上觸發了一個簡單的TWICE選擇另一個項目(一次有0個項目,第二個選擇了新項目)。所以我的盒子總是會顯示「Unselected all!」而如果我之前選擇了一件商品並正在更換另一件商品,則它將加載任何附加信息。

有沒有什麼辦法可以區分未選擇的所有項目的實際事件觸發與選擇另一個項目事件的初始觸發0項目?

回答

4

您可以改爲註冊到ListView的ItemSelectionChangedEvent。

 this.listView1.ItemSelectionChanged += this.HandleOnListViewItemSelectionChanged; 

     private void HandleOnListViewItemSelectionChanged(Object sender, ListViewItemSelectionChangedEventArgs e) 
     { 
      if (e.IsSelected) 
      { 
       this.detailsLabel.Text = this.GetDetails(e.Item); 
      } 
      else 
      { 
       this.detailsLabel.Text = String.Empty; 
      } 
     } 
+1

非常感謝。這是我正在尋找的。 – kharles 2011-04-21 08:59:21

+0

也永遠不要低估在項目上工作的前一個人添加了額外的事件處理程序。 < - 我的問題。 – Brent 2014-05-26 19:18:17

+0

我試過這個,ItemSelectionChanged事件也會觸發兩次。 e.IsSelect變爲false,然後變爲true,導致閃爍發生。 – myQwil 2017-02-03 21:35:59

-1

你可以做這樣的事情:

  private bool isInitialized = false; 
     private void listView1_SelectedIndexChanged(object sender, EventArgs e) { 
      if (isInitialized) { 
       ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems; 

       if (collection.Count == 0) { 
        this.label2.Text = "Unselected all!"; 
       } 
       foreach (ListViewItem item in collection) { 
        getSideInformation(item.Text); 
       } 
      } 
      isInitialized = true; 
     } 

這將確保首次發射將被忽略。

+0

中的SelectedIndexChanged爲每一個選擇的變化,但(一旦有0項,一旦與選定項)被解僱兩次。這並不能完全讓我區分那一次與0項與與選擇所有項目相關聯的射擊。 我玩了一個布爾值,但仍然無法讓它的工作,因爲在選擇另一個項目或取消選擇al項目的情況下,以前的狀態是選擇了某種東西。 – kharles 2011-04-21 07:35:48

+0

這不同於,我認爲它只在加載時發射兩次。我現在將編輯我的答案。 – Vale 2011-04-21 07:37:55

+0

我現在不明白。如果它觸發兩次,它將首次將標籤文本設置爲「Unselected all」,第二次將它設置爲您從getSideInformation()方法獲得的其他值。所以,應該顯示第二個值。檢查你的方法或編輯問題,它不是很清楚。 – Vale 2011-04-21 07:54:14

1

在任何可以選擇多個項目的控件中,SelectedIndexChanged事件觸發兩次。一,刪除取消選擇的項目,然後添加選定的項目。當你第一次點擊時,選擇的項目集合爲空,因此它被觸發一次。下次它會發射兩次。

0

您可以使用事件塊內的下面的代碼檢查 SelectedIndexChange事件是否直接開火,因爲控制從其他用戶控件/部分回發事件的頁面或因

string id= Request.Form["__EVENTTARGET"]; 

if(!string.IsNullorEmpty(id)) 
{ 
//your code here 
} 
1

最好解決辦法我發現是一個事件處理程序臨時設置爲Application.Idle,並從那裏做你檢查,像這樣:

bool handled; 
private void listView1_SelectedIndexChanged(object sender, EventArgs e) { 
    if (!handled) 
    { handled = true; 
     Application.Idle += SelectionChangeDone; } 
} 

private void SelectionChangeDone(object sender, EventArgs e) { 
    Application.Idle -= SelectionChangeDone; 
    handled = false; 

    ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems; 

    if (collection.Count == 0) 
     this.label2.Text = "Unselected all!" 

    foreach (ListViewItem item in collection) 
     getSideInformation(item.Text); 
} 

它不應該無論使用ItemSelectionChangedSelectedIndexChanged。在這種情況下,兩者都能正常工作。

大感謝去文法他的回答基本相同的問題在這裏:https://stackoverflow.com/a/26393234/2532220

相關問題