您的位置:首页 > 其它

在Datagridview控件利用下拉菜单进行枚举数据输入

2011-03-05 19:00 387 查看
在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;
}
}
}

这样再将重新包装的类绑定到下拉列,就可以实现枚举在列表中的选择了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: