在Datagridview控件利用下拉菜单进行数据输入可以使用户操作更加方便,在配置COMBOX控件时,只要设置了datasource, displaymember,valuemember,即可实现comboxbox的数据输入,如:
有一个类如下:
public class Class1 { string _Name;
public string Name { get { return _Name; } set { _Name = value; } } int _Weight;
public int Weight { get { return Weight; } set { Weight = value; } }
}
如果存在集合List<Class1> P1
定义一个Combobox1.DataSource= P1;
Combobox1.DisplayMember="Name";
ComboBox1.ValueMember="Weight";
这样,在获取Combobox1.SelectedItem时,获取的是对象的Weight值,
而如果将combobox的datasource绑定一个枚举enmu的话,不用设置displaymember及valuemember即可通过selectedItem获得枚举值。
对于一个列表控件Dgv_ClassTest,要添加DataGridViewComboBoxColumns,也可以采用同样方法,如将下拉菜单了的数据源对应valuememeber设为Class1,则该列添加的单元格的类型也必须是Class1类型,因此我们要对原有的Class1进行一下改造:
public class Class1 { string _Name;
public string Name { get { return _Name; } set { _Name = value; } } int Weight;
public int Weight1 { get { return Weight; } set { Weight = value; } } public Class1 Class1 { get { return This; } }
}
这样在选中一项纪录时,就可以按如下方式配置列:
CmbCol.DataSource=P1;
CmbCol.DisPlayMember=="Name";
CmbCol.ValueMember="Class1";
假设存在一个类如下:
public class Class2 { private Class1 _C1;
public Class1 C1 { get { return _C1; } set { _C1 = value; } } private string _Name; public string Name { get { return _Name; } set { _Name = value; } } }
有一个该类的集合BindingList<Class2> P2对列表进行绑定
Dgv_ClassTest.Datasource=P2;
CmbCol.DataBoundItem="C1";
NameCol.DataBoundItem="Name";
这样P2集合就可以通过列表控件进行数据的输入输出了。
但对于枚举,因为无法设置DisplayMember和ValueMember, 因此绑定时会报值无效的错误,网上国内国外的帖子的解决方法都是重写dataerorr事件,当这是个馊主意,因为异常发生了,就得解决,抛出去不理怎们行,况且这样简单抛掉,其他错误也会抛掉,反而不利于排错。
我的解决方法是,将枚举重新打包成一个新的静态类,比如,我们将KnownColor枚举包装如下:
public class MyKnownColor { private KnownColor _color; private static List<MyKnownColor> _ColorList;
public static List<MyKnownColor> ColorList { get { if (_ColorList == null) { _ColorList = new List<MyKnownColor>(); Array xx = Enum.GetValues(typeof(KnownColor)); MyKnownColor p = null; foreach (KnownColor x in xx) { p = new MyKnownColor(x); ColorList.Add(p); } } return MyKnownColor._ColorList; } }
public MyKnownColor Color { get { return this ; } } private MyKnownColor(KnownColor c) {
_color = c; }
public string Name { get { return _color.ToString(); } } public KnownColor KnownColor { get { return _color; } } public int Index { get { return _color.GetHashCode()-1; } } }
这样再将重新包装的类绑定到下拉列,就可以实现枚举在列表中的选择了。