簡體   English   中英

C#:在SelectedIndexChanged上針對listview的bizzare多個事件觸發

[英]C#: bizzare multiple event firing for listview on SelectedIndexChanged

如果我將listview組件放入Windows窗體中,並將​​波紋管代碼添加到它的SelectedIndexChanged事件中:

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

該消息框將顯示4次! 這是為什么?

注意 :我使用循環清除列表視圖中的選定項目

您不應在SelectedIndexChanged事件中更改選擇。 更一般而言, 您不應在屬性已更改的通知內更改屬性

如果您需要更改屬性以響應通知,請查看處理相應的*Changing事件。 並非是某事已更改(在事實之后發生)的通知,而是某事即將發生更改(在事實之前發生)的通知。 SelectedIndexChanging事件中,您有幾個不同的選項可以更改事件的過程:

  1. 您可以將e.Cancel屬性設置為true ,就像上面所說的那樣。 它將取消事件並防止所選索引更改。
  2. 您可以使用e.NewSelectedIndex屬性更改選擇。 只需將此屬性設置為要選擇的項目的索引即可。

而且,如果您想響應其他事件( 例如 ,單擊不屬於ListView的“清除選擇”按鈕或類似的上下文菜單項)而清除ListView中的選定項目,則不要完全需要一個循環。 只需清除控件的SelectedItems集合: myListView.SelectedItems.Clear() 同樣,您不能這樣做以響應SelectedIndexChanged事件,否則您將遇到觸發大量通知的相同問題。

坦白地說,您在此處編寫的代碼沒有任何意義。 當用戶嘗試選擇一個項目時,為什么要清除所有選中的項目? 如果不想允許選擇,請通過將控件的Enabled屬性設置為false來禁用該控件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM