用枚举绑定转发器列表

时间:2015-02-24 11:21:45

标签: asp.net vb.net enums

我有一个要求,当用户点击图像时,列表应显示复选框,并且DB和用户中存在的所有类别都应该能够选中复选框。如何使用asp:repeater控件实现这一目标? caegory是一个枚举类型,可以有n个值。在转发器中,我添加了一个复选框和一个标签;标签应显示类别文本。

1 个答案:

答案 0 :(得分:0)

首先,您应该将[Description]属性添加到Enum中的每个值。这允许您为每个值设置适当的描述性文本。此属性位于System.ComponentModel中,这是一个示例: -

public enum CalendarShowAsEnum
{
    [Description("None")]
    None = 10,
    [Description("Busy")]
    Busy = 20,
    [Description("Out Of Office")]
    OutOfOffice = 30,
    [Description("On Holiday")]
    OnHoliday = 40
}

然后你需要2个功能: -

  • 将Enum类型和ListBox / DropDown作为参数的一个函数,并将每个枚举的条目添加到列表中

  • 帮助函数,它将枚举转换为您给出的描述性标题(上例)

List函数可能如下所示(所有这些都来自我工作的项目): -

    public static void BindNamedEnumList(ListControl    list,
                                         Type           enumerationType)
    {               
        list.Items.Clear();

        Array       array = Enum.GetValues(enumerationType);
        ListItem    item;
        string      name;

        var enumerator = array.GetEnumerator();

        if (enumerator != null)
        {
            while (enumerator.MoveNext())
            {
                Enum value = enumerator.Current as Enum;
                name = EnumHelper.GetEnumName(value);

                item = new ListItem(name);
                item.Value = Convert.ToInt32(value).ToString();

                list.Items.Add(item);
            }
        }
    }

此函数采用Type和ListControl(ListBox和DropDownList都继承自)。 Type是要添加到列表的枚举的.GetType()。请注意,它选择任何值,并且 依赖于具有定义的整数值的每个枚举值。后一部分将帮助您选择单个项目。

注意循环调用EnumHelper.GetEnumName(value) - 这是使用我在开头提到的Description属性的辅助函数。此功能如下所示: -

    public static string GetEnumName(object value)
    {
        string retVal = string.Empty;

        try
        {
            FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

            retVal = ((attributes.Length != 0) ? attributes[0].Description : value.ToString());
        }
        catch (System.NullReferenceException)
        {
        }
        finally
        {
            if (string.IsNullOrEmpty(retVal))
            {
                retVal = "Unknown";
            }
        }

        return retVal;
    }

它使用反射,因此您需要为System.Reflection添加Imports

要使用list函数将一组Enum值绑定到列表,只需调用

即可

{HelperClass}.BindNamedEnumList(myListBox, typeof({MyEnumType})