C#--SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的區別及聯絡
三個事件的觸發條件和區別
SelectedIndexChanged事件
索引改變時即觸發嗎,可以通過程式設計觸發
SelectedValueChanged事件
值改變時觸發,可以通過程式設計觸發
SelectionChangeCommitted事件
在設定datasource和displaymember和valuemember時,以及手動改變combobox索引和值時都不觸發該事件, 只是在介面選擇combobox不同值時觸發,即只有通過介面點選修改combobox的值才會觸發此事件
區別
1、SelectedIndexChanged和SelectedValueChanged可以通過程式設計的方式更改屬性而觸發事件,但SelectionChangeCommitted事件必須由使用者操作選定選項才能觸發。
2、在初始化時(設定源)SelectedIndexChanged和SelectedValueChanged都會被呼叫,而SelectionChangeCommitted沒有這個問題。
不同的程式碼順序觸發的先後順序和次數
關於在程式設計時通過設定DataSource, DisplayMember, ValueMember不同順序均可觸發SelectedIndexChanged事件和SelectedValueChanged事件的次數,但是不會觸發SelectionChangeCommitted
順序一
this.comboBox1.DisplayMember = "userName"; (不觸發) this.comboBox1.ValueMember = "userAge"; (只觸發SelectedValueChanged) this.comboBox1.DataSource = dt; (都觸發)
SelectedValueChanged觸發兩次(總是先觸發)SelectedIndexChanged,觸發一次 (設定DisplayMember屬性時不觸發兩種事件)
順序二
this.comboBox1.ValueMember = "userAge"; (只觸發SelectedValueChanged)
this.comboBox1.DisplayMember = "userName";(不觸發)
this.comboBox1.DataSource = dt; (兩者都觸發)
同上,SelectedValueChanged觸發兩次(總是先觸發)SelectedIndexChanged,觸發一次 (設定DisplayMember屬性時不觸發兩種事件)
順序三
this.comboBox1.DataSource = dt; (都觸發)
this.comboBox1.DisplayMember = "userName";(都觸發)
this.comboBox1.ValueMember = "userAge";(只觸發SelectedValueChanged事件)
SelectedValueChanged觸發三次(總是先觸發)SelectedIndexChanged,觸發兩次 (設定DisplayMember屬性時不觸發兩種事件)
順序四:
this.comboBox1.DataSource = dt; (都觸發)
this.comboBox1.ValueMember = "userAge";(都觸發) 其中SelectedValueChanged觸發兩次
this.comboBox1.DisplayMember = "userName";(都觸發)
SelectedValueChanged觸發四次(總是先觸發)SelectedIndexChanged,觸發三次 (設定DisplayMember屬性時不觸發兩種事件)
分析
說明:當設定了DataSource 屬性後,SelectedValue 屬性值會預設為第一行(所以會觸發SelectedIndexChanged事件和SelectedValueChanged事件),因此,如果不希望ComboBox自動選擇第一行,還需在設定完DataSource 後自行將SelectedValue 設為“”。