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 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 = -; //如果设置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的数据库加载方法即可!
最新文章
- MyCat:取代Cobar数据库中间件
- 解决: is not found. Have you run APT to generate them?
- aufomaper Queryable Extensions ProjectTo
- delphi之多线程编程
- C# 读取Excel
- Java各种类型占用的字节数
- 面向站长和网站管理员的Web缓存加速指南
- android:persistent属性
- Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器
- java数组中的三种排序方法中的冒泡排序方法
- c# datetime与 timeStamp(unix时间戳) 互相转换
- C# 把Div变为滚动条
- Setting up Scatter for Web Applications
- AngularJS中控制器继承
- scokte tcp/ip
- bzoj2565: 最长双回文串 pam
- ThinkPHP验证码类的使用
- WIN8配置IIS8.0+PHP+Mysql+Zend
- python 常见的内置函数
- Unreal Engine 4 笔记 2
热门文章
- Win10《芒果TV》商店版更新v3.1.3.0:优化应用速度,支持会员卡兑换
- 使用Notepad++远程编辑Ubuntu上的源码
- 写给非专业人士看的 *** 简介(同时也解释了GFW )
- Android零基础入门第2节:Android 系统架构和应用组件那些事
- 简单的Windows Webcam应用:Barcode Reader
- Delphi 10.2的 更新说明,所有官方资料:新特征和Bugfix列表,所有工具开发说明
- FMXUI中的三大杀器:TView、TLinearLayout、TRelativeLayout
- Qt给应用程序添加版本信息(对rc文件的设置,可利用QT内置变量)
- GetLastError()返回值列表(3259个错误列表)
- 2019年5月23日 AY 程序员调侃语录