SelectionChangeCommitted事件 在設定datasource和displaymember和valuemember時,以及手動改變combobox索引和值時都不觸發該事件, 只是在界面選擇combobox不同值時觸發。
SelectedIndexChanged事件 當 SelectedIndex 屬性更改時發生,索引改變時觸發。
SelectedValueChanged事件 當 SelectedValue 屬性更改時發生,值改變時觸發。
--------------------------------------------------------------------------------------------------------------------------
區別:
1、SelectedIndexChanged和SelectedValueChanged可以通過編程的方式更改屬性而觸發事件,但SelectionChangeCommitted事件必須由用戶操作選定選項才能觸發。
2、在初始化時(設置源)SelectedIndexChanged和SelectedValueChanged都會被調用,而SelectionChangeCommitted沒有這個問題。
3、SelectionChangeCommitted也有一個小問題,當打開下拉菜單,用鍵盤的上下光標鍵選擇條目後(不用鼠標點擊),鼠標點擊其他控件,使焦點轉移,此時comboBox的Text屬性已改變,SelectedIndex屬性也已改變,但這樣的操作不會觸發SelectionChangeCommitted事件。結論:SelectionChangeCommitted一定要由鼠標選擇才能觸發(個人感覺)。
--------------------------------------------------------------------------------------------------------------------------
關於事件的觸發
設置DataSource, DisplayMember, ValueMember不同順序觸發SelectedIndexChanged事件和SelectedValueChanged事件的次數
順序一:
this.comboBox1.DisplayMember = "userName"; (不觸發)
this.comboBox1.ValueMember = "userAge"; (只觸發SelectedValueChanged)
this.comboBox1.DataSource = dt; (都觸發)
SelectedValueChanged觸發兩次(總是先觸發)SelectedIndexChanged,觸發一次 (設置DisplayMember屬性時不觸發兩種事件)
順序二:
this.comboBox1.ValueMember = "userAge";
this.comboBox1.DisplayMember = "userName";
this.comboBox1.DataSource = dt;
同上
順序三:
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 設爲“”。