在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;
}
}
}
這樣再將重新包裝的類綁定到下拉列,就可以實現枚舉在列表中的選擇了。