DisplayMember綁定需要顯示的數據表字段,
而ValueMember綁定需要獲取選擇的項的值。
然后通過
combo.SelectedValue就可以取得選中項的值了。
DisplayMember會顯示在你的下拉框中,ValueMember的值和下拉框顯示的值一一對應,並不在下拉框顯示的。
所對應的值就是一條記錄里面 有標識列ID(唯一) 有顯示的列(如名稱,可重復)
ValueMember 可以成為名稱,也可成為ID
但是一般來說都只綁定ID 這樣好處理,也很方便識別,
DisplayMember 是綁定顯示的數據 如:北京
一般DisplayMember是顯示給客戶看的
而ValueMember 是綁定處理程序標識 給程序員看的。
------------------------------------------------------------------------------------------
比如數據庫一個字段 性別
用 0或者 1存儲
combobox中DisplayMember顯示為男或者女,ValueMember綁定的對應數據庫的字段
當你保存時,要存到數據庫0或者1,這時候直接獲取選中的valuemenber時存儲就可以了
---------------------------------------------------------------------------------------------------------------------------------
一般做法:
首先需要指定 combox.DataSource,
然后用表DataSource的字段名設置combox 的 ValueMember和DisplayMember ,
那么當你選擇combox 的一個item時,你直接可見的是此item的 DisplayMember 對應內容,
而此 item的值是ValueMember 的對應內容。
關於.net winform ComboBox的DataSource,DisplayMember和ValueMember屬性的
設置順序的問題。《參考博客》
ComboBox的DataSource屬性為object類型,但是需要實現IListSource接口的類型。
當把DataTable賦值給該屬性后,如果此時沒有指定ComboBox的DisplayMember和ValueMember屬性的話,
這時獲得的ComboBox的SelectValue屬性將是System.Data.DataRowView的一個實例。
據此推測DataTable中實現的IListSource接口中的GetList()方法應該返回的是DataTable的
DefaultView,也就是DataView的一個實例是DataRowView的集合。而因為沒有指定DisplayMember和ValueMember
屬性,所以ComboBox直接把DataView中的每一個DataRowView實例填充到列表中。
這樣的話就可能在ComboBox的SelectedIndexChanged事件處理中產生錯誤。
為了避免這個問題應該先設置DisplayMember和ValueMember屬性,然后再設置DataSource屬性。
避免先設置DataSource屬性。
例如:
public static void SetShopComboSpecial(ComboBox combo) { DataTable dt = CommonService.GetShopSpecial(); if (dt == null) throw new Exception(); combo.ValueMember = "SHOPID"; combo.DisplayMember = "COMBO_DISPLAY"; combo.DataSource = dt; }
關於winform的combobox聯動問題的解決方案:
在使用DataSource添加加載值(從數據庫),只要一賦值,添加ValueMember等就會觸發selectedindexChanged事件,與寫在formload里無關!
private void Form1_Load(object sender, EventArgs e) { this.listBox1.Items.Add("軟件部"); this.listBox1.Items.Add("人事部"); this.listBox1.Items.Add("財務部"); this.listBox1.Items.Add("硬件部"); this.listBox1.SelectedIndex = -1; //如果設置0,1,2,3則在load加載窗體時就會彈出對話框了!-1表示為空,因為設置1表示index變了,會觸發事件 this.comboBox1.Items.Add("軟件部"); this.comboBox1.Items.Add("人事部"); this.comboBox1.Items.Add("財務部"); this.comboBox1.Items.Add("硬件部"); //this.comboBox1.SelectedIndex = 0;//會觸發comboBox1_SelectedIndexChanged事件 DataTable dt1 = new DataTable("部門表"); dt1.Columns.Add("部門項"); DataRow dr1 = dt1.NewRow(); dr1["部門項"] = "軟件部"; dt1.Rows.Add(dr1); DataRow dr2 = dt1.NewRow(); dr2["部門項"] = "人事部"; dt1.Rows.Add(dr2); comboBox2.ValueMember = "部門項"; comboBox2.DisplayMember = "部門項"; comboBox2.DataSource = dt1;//使用DataSource賦值,設置ValueMember后肯定會觸發當前comboBox2的comboBox2_SelectedIndexChanged事件 }
三個combobox級聯的時候,在form_load事件中添加方法:從數據庫加載combobox1的值,會觸發此combobox的事件Shop_SelectedIndexChanged,在事件中填寫設置第二個combobox的數據庫加載方法即可!
