C# 将许多枚举值添加到组合框更简单
我对c#和编程非常陌生,我想知道如何将这些代码放入函数中C# 将许多枚举值添加到组合框更简单,c#,function,combobox,enums,C#,Function,Combobox,Enums,我对c#和编程非常陌生,我想知道如何将这些代码放入函数中 comboBox1.Items.Add(DAO.DataTypeEnum.dbInteger); comboBox1.Items.Add(DAO.DataTypeEnum.dbBigInt); comboBox1.Items.Add(DAO.DataTypeEnum.dbBinary); comboBox1.Items.Add(DAO.DataTypeEnum.dbBoolean); comboBox1.Items.Add(DAO.Dat
comboBox1.Items.Add(DAO.DataTypeEnum.dbInteger);
comboBox1.Items.Add(DAO.DataTypeEnum.dbBigInt);
comboBox1.Items.Add(DAO.DataTypeEnum.dbBinary);
comboBox1.Items.Add(DAO.DataTypeEnum.dbBoolean);
comboBox1.Items.Add(DAO.DataTypeEnum.dbByte);
comboBox1.Items.Add(DAO.DataTypeEnum.dbChar);
comboBox1.Items.Add(DAO.DataTypeEnum.dbCurrency);
comboBox1.Items.Add(DAO.DataTypeEnum.dbDate);
comboBox1.Items.Add(DAO.DataTypeEnum.dbDecimal);
comboBox1.Items.Add(DAO.DataTypeEnum.dbDouble);
comboBox1.Items.Add(DAO.DataTypeEnum.dbFloat);
comboBox1.Items.Add(DAO.DataTypeEnum.dbGUID);
comboBox1.Items.Add(DAO.DataTypeEnum.dbLong);
comboBox1.Items.Add(DAO.DataTypeEnum.dbLongBinary);
comboBox1.Items.Add(DAO.DataTypeEnum.dbMemo);
comboBox1.Items.Add(DAO.DataTypeEnum.dbNumeric);
comboBox1.Items.Add(DAO.DataTypeEnum.dbSingle);
comboBox1.Items.Add(DAO.DataTypeEnum.dbText);
comboBox1.Items.Add(DAO.DataTypeEnum.dbTime);
comboBox1.Items.Add(DAO.DataTypeEnum.dbTimeStamp);
comboBox1.Items.Add(DAO.DataTypeEnum.dbVarBinary);
我有5个组合框,我想不用为每个组合框编写所有这些,我可以创建一个函数,但不知道怎么做。还有,有没有办法改变名字?例如,当我下拉框时,它显示:dbInteger,dbBigInt?我能把它们改成整数,大整数吗?提前感谢。创建一个函数,接收组合框作为参数:
static void PopulateComboBox(ComboBox comboBox)
{
comboBox.Items.Add(DAO.DataTypeEnum.dbInteger);
comboBox.Items.Add(DAO.DataTypeEnum.dbBigInt);
....
}
可以这样称呼:
PopulateComboBox(comboBox1);
PopulateComboBox(comboBox2);
....
你可以在一行中完成
comboBox1.Items.AddRange(Enum.GetNames(typeof(DAO.DataTypeEnum)));
关于显示名称,我通常使用DescriptionAttribute
并编写一个提取该信息的小扩展方法,例如
public enum DataTypeEnum
{
[Description("Integer")]
dbInteger,
[Description("Big Int")]
dbBigInt,
...
}
然后使用以下扩展方法
public static class EnumExt
{
public static string Description(this Enum value)
{
var attr = (DescriptionAttribute)value.GetType().GetCustomAttributes(typeof(DescriptionAttribute), false)
.FirstOrDefault();
return attr != null ? attr.Description : value.ToString();
}
}
还有一点点林克
var enums = (DataType[])Enum.GetValues(typeof(DataType));
combo.Items.AddRange(enums.Select(x => x.Description()).ToArray());
那么你应该以
Integer
Big Int
...
将代码移动到接受组合框作为参数的方法中
private void AddValues(ComboBox comboBox)
{
comboBox.Items.Add(DAO.DataTypeEnum.dbInteger);
comboBox.Items.Add(DAO.DataTypeEnum.dbBigInt);
...
...
}
然后使用AddValues(comboBox1)调用它代码>
您也可以为ComboBox设置一个显示值,您可以将该值设置为绑定类的特定属性。我不确定您是否可以使用枚举值列表来实现这一点,但如果它们都有关联的描述,您可能可以显示该值
public void UpdateComboBox(ComboBox cmbBox, Type t)
{
foreach(string item in Enum.GetNames(t))
{
cmbBox.Items.Add(item);
}
}
用法:
UpdateComboBox(comboBox1, typeof(DAO.DataTypeEnum));
如果尝试枚举DAO.DataTypeEnum?:
public static void FillComboBox(ComboBox cb)
{
cb.AddRange(Enum.GetValues(typeof(DAO.DataTypeEnum);
}
如何定义枚举?你想覆盖枚举中的每个值吗?很有魅力(:非常感谢。现在有办法更改项的名称吗?哦,是的,我刚刚看到了。但是我在扩展方法上遇到了一个错误:var attrs=(DescriptionAttribute)typeof(T)。GetCustomAttributes(typeof(DescriptionAttribute),false);说:无法转换type'object[]'to System.ComponentModel.DescriptionAttribute'Hmmm现在我得到attr.Description-对象不包含“Description”的防御,并且没有接受类型为'Object'的第一个参数的扩展方法'Description':(我想我会在不更改名称的情况下保留它,现在对于LINQ I get:参数1:无法从“System.Collections.Generic.IEnumerable”转换为“object[]”和:错误1“System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])的最佳重载方法匹配有一些无效参数,直到出现一些错误:(:错误2“System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])”的最佳重载方法匹配项有一些无效参数错误3参数1:无法从“TResult[]”转换为“object[]“错误1'string'不包含'Description'的定义,并且找不到接受'string'类型的第一个参数的扩展方法'Description'(是否缺少using指令或程序集引用?)。对于所有的问题,非常抱歉……您应该在此处使用AddRange
,请参阅我的答案。