Winform中的下拉列表控件ComboBox,在使用DataSource属性赋数据源后,想添加“请选择”或“全部”这样一个选项,比WEB中要麻烦一些,经过测试,我们只能在数据源上做文章,即需要在数据源中添加这样一项。
一般开发中,最常用的数据源有两种,一是List泛型集合,二是DataTable。
示例代码如下:
一:数据源是List集合:
List<BookType> list = GetList() as List<BookType>; //GetList是一个返回IList的方法
list.Insert(0,new BookType("0","请选择"));//如果实体对象有多个属性,可以在实例化该对象后,只为用到的两个属性赋值
comboBox1.DataSource = list;
comboBox1.DisplayMember = "Typename";
comboBox1.ValueMember = "typeId";
二:数据源是DataTable:
DataTable dt=GetDataTable();
DataRow dr = dt.NewRow();
dr["typeID"] = "0";
dr["typeName"] = "请选择";
dt.Rows.InsertAt(dr, 0);
cbxType.DataSource = dt;
cbxType.DisplayMember = "typeName";
cbxType.ValueMember = "typeID";
使用时请注意:
注意:需要将“DisplayMember”和“ValueMember”属性的指定放在“DataSource”的指定的前面,否则在一定条件下出现“.SelectedIndex = 0”的指定失败。
如下图所示的“所属格子”中的绑定内容项指定失败,实际上存在内容,估计由于属性指定时加载先后顺序问题造成失败!!!
对应的代码为:
...... string layerGridName = string.Empty; if (layerID > 0) { layerGridName = "所有可用格子" + "_[" + layerGridList.Count + "]"; } else { layerGridName = "所有分层可用格子" + "_[" + layerGridList.Count + "]"; } LayerGrid selectAllFreeGrid = new LayerGrid(); selectAllFreeGrid.Id = -1; selectAllFreeGrid.GridCode = layerGridName; layerGridList.Insert(0, selectAllFreeGrid);//如果实体对象有多个属性,可以在实例化该对象后,只为用到的两个属性赋值 bExecuteCboGridIndexChanged = false; cboGrid.DataSource = null; cboGrid.Items.Clear();//清空节点,避免了设置 DataSource 属性后无法显示修改项集合 //注意:需要将“DisplayMember”和“ValueMember”属性的指定放在“DataSource”的指定的前面,否则在一定条件下出现“.SelectedIndex = 0”的指定失败。 cboGrid.DataSource = layerGridList; cboGrid.DisplayMember = "GridCode"; cboGrid.ValueMember = "Id"; cboGrid.SelectedIndex = 0; bExecuteCboGridIndexChanged = true; cboGrid_SelectedIndexChanged(null, null);
正确的代码为及执行结果图示:
string layerGridName = string.Empty; if (layerID > 0) { layerGridName = "所有可用格子" + "_[" + layerGridList.Count + "]"; } else { layerGridName = "所有分层可用格子" + "_[" + layerGridList.Count + "]"; } LayerGrid selectAllFreeGrid = new LayerGrid(); selectAllFreeGrid.Id = -1; selectAllFreeGrid.GridCode = layerGridName; layerGridList.Insert(0, selectAllFreeGrid);//如果实体对象有多个属性,可以在实例化该对象后,只为用到的两个属性赋值 bExecuteCboGridIndexChanged = false; cboGrid.DataSource = null; cboGrid.Items.Clear();//清空节点,避免了设置 DataSource 属性后无法显示修改项集合 cboGrid.DisplayMember = "GridCode"; cboGrid.ValueMember = "Id"; //注意:需要将“DisplayMember”和“ValueMember”属性的指定放在“DataSource”的指定的前面,否则在一定条件下出现“.SelectedIndex = 0”的指定失败。 cboGrid.DataSource = layerGridList; cboGrid.SelectedIndex = 0; bExecuteCboGridIndexChanged = true; cboGrid_SelectedIndexChanged(null, null);