首页 > 代码库 > VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题

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的数据库加载方法即可!

VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题