2016-05-28 12 views
0

如果我把一個列表視圖組件到Windows窗體中添加婁代碼到它的SelectedIndexChanged事件:C#的bizzare多個事件觸發的列表視圖上的SelectedIndexChanged

MessageBox.Show("Fired!"); 
foreach (int selectedIndex in listView1.SelectedIndices) 
{ 
    listView1.Items[selectedIndex].Selected = false; 
    listView1.Items[selectedIndex].Focused = false; 
} 

消息框將顯示4倍!這是爲什麼?

注意:我用的是循環以清除列表視圖

+0

每次更改選擇時,都會觸發SelectedIndexChanged事件。所以你需要在foreach循環( - = SelectedIndexChanged)之前臨時移除事件處理器,並且在循環之後再次附加處理器(+ = SelectedIndexChanged) – Odrai

+0

ItemSelectionChnaged怎麼樣?它的行爲是否一樣? – wiki

+0

我檢查了ItemSelectionChnaged;一樣的; 我該如何刪除事件處理程序? – wiki

回答

1

選定的項目你不應該改變一個SelectedIndexChanged事件的選擇。更一般地說,您不應該更改屬性已更改的通知中的屬性

如果您需要更改屬性以響應通知,請處理相應的*Changing事件。它不是通知事情已經發生變化(事實發生後),而是通知某事即將發生變化(事實發生之前)。在SelectedIndexChanging情況下,你有幾個不同的選項來改變事件的過程:

  1. 您可以將e.Cancel屬性設置爲true,這將這樣做,因爲它說。它將取消該事件並防止選定的索引改變。
  2. 您可以使用e.NewSelectedIndex屬性來更改選擇。只需將此屬性設置爲您想要選擇的項目的索引即可。

如果你想清除響應其他一些事件在ListView所選的項目(,在「清除選擇」按鈕,點擊,是不是ListView中的一部分,或相似背景菜單項),你根本不需要循環。只需清除控件的SelectedItems集合:myListView.SelectedItems.Clear()。再次,您不能對SelectedIndexChanged事件做出響應,否則您將遇到觸發一堆通知的相同問題。老實說,雖然你寫在這裏的代碼是沒有意義的。爲什麼要在用戶嘗試選擇某個項目時清除所有選定的項目?如果您不想允許選擇,請將其Enabled屬性設置爲false以禁用該控件。

+0

OK;謝謝澄清。 – wiki

相關問題