VS2010 winform開發筆記---combox的SelectedIndexChanged事件及級聯問題


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 ComboBoxDataSourceDisplayMemberValueMember屬性的
設置順序的問題。
《參考博客》

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的數據庫加載方法即可!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM