zoukankan      html  css  js  c++  java
  • 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的数据库加载方法即可!

  • 相关阅读:
    c# 面相对象4-多态性
    c# 面相对象3-之继承性
    c# 面相对象2-之封装性
    面向对象和面向过程的区别
    <title>下拉菜单</title>
    15-07-31 javascript--事件
    DOM操作
    格式与布局
    c# 函数相关练习
    c# 哈希表集合;函数
  • 原文地址:https://www.cnblogs.com/ammy714926/p/4195373.html
Copyright © 2011-2022 走看看