Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将许多枚举值添加到组合框更简单_C#_Function_Combobox_Enums - Fatal编程技术网

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

我对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.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
,请参阅我的答案。