1. 程式人生 > >C#--SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的區別及聯絡

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 設為“”。