Как связать Enum с элементом управления DropDownList в ASP.NET? - PullRequest
117 голосов
/ 15 сентября 2008

Допустим, у меня есть следующее простое перечисление:

enum Response
{
    Yes = 1,
    No = 2,
    Maybe = 3
}

Как связать это перечисление с элементом управления DropDownList, чтобы описания отображались в списке, а также извлекали соответствующее числовое значение (1,2,3) после выбора параметра?

Ответы [ 23 ]

4 голосов
/ 29 июня 2011
public enum Color
{
    RED,
    GREEN,
    BLUE
}

ddColor.DataSource = Enum.GetNames(typeof(Color));
ddColor.DataBind();
3 голосов
/ 17 января 2010

Общий код с использованием ответа шесть.

public static void BindControlToEnum(DataBoundControl ControlToBind, Type type)
{
    //ListControl

    if (type == null)
        throw new ArgumentNullException("type");
    else if (ControlToBind==null )
        throw new ArgumentNullException("ControlToBind");
    if (!type.IsEnum)
        throw new ArgumentException("Only enumeration type is expected.");

    Dictionary<int, string> pairs = new Dictionary<int, string>();

    foreach (int i in Enum.GetValues(type))
    {
        pairs.Add(i, Enum.GetName(type, i));
    }
    ControlToBind.DataSource = pairs;
    ListControl lstControl = ControlToBind as ListControl;
    if (lstControl != null)
    {
        lstControl.DataTextField = "Value";
        lstControl.DataValueField = "Key";
    }
    ControlToBind.DataBind();

}
3 голосов
/ 25 марта 2010

Найдя этот ответ, я придумал, как мне кажется, лучший (хотя бы более элегантный) способ сделать это, подумал, что вернусь и поделюсь им здесь.

Page_Load:

DropDownList1.DataSource = Enum.GetValues(typeof(Response));
DropDownList1.DataBind();

LoadValues:

Response rIn = Response.Maybe;
DropDownList1.Text = rIn.ToString();

SaveValues:

Response rOut = (Response) Enum.Parse(typeof(Response), DropDownList1.Text);
1 голос
/ 25 февраля 2017

Это, наверное, старый вопрос ... но я так и сделал.

Модель:

public class YourEntity
{
   public int ID { get; set; }
   public string Name{ get; set; }
   public string Description { get; set; }
   public OptionType Types { get; set; }
}

public enum OptionType
{
    Unknown,
    Option1, 
    Option2,
    Option3
}

Затем в представлении: вот как использовать заполнить раскрывающийся список.

@Html.EnumDropDownListFor(model => model.Types, htmlAttributes: new { @class = "form-control" })

Это должно заполнить все в вашем списке enum. Надеюсь, это поможет ..

1 голос
/ 02 декабря 2009

Почему бы не использовать подобное, чтобы иметь возможность передавать каждый список управления:

<code>
public static void BindToEnum(Type enumType, ListControl lc)
        {
            // get the names from the enumeration
            string[] names = Enum.GetNames(enumType);
            // get the values from the enumeration
            Array values = Enum.GetValues(enumType);
            // turn it into a hash table
            Hashtable ht = new Hashtable();
            for (int i = 0; i < names.Length; i++)
                // note the cast to integer here is important
                // otherwise we'll just get the enum string back again
                ht.Add(names[i], (int)values.GetValue(i));
            // return the dictionary to be bound to
            lc.DataSource = ht;
            lc.DataTextField = "Key";
            lc.DataValueField = "Value";
            lc.DataBind();
        }
И использовать так же просто, как:
<code>
BindToEnum(typeof(NewsType), DropDownList1);
BindToEnum(typeof(NewsType), CheckBoxList1);
BindToEnum(typeof(NewsType), RadoBuuttonList1);
1 голос
/ 15 сентября 2008

Это не совсем то, что вы ищете, но может помочь:

http://blog.jeffhandley.com/archive/2008/01/27/enum-list-dropdown-control.aspx

1 голос
/ 18 ноября 2014

ASP.NET был с тех пор обновлен с некоторыми дополнительными функциями, и теперь вы можете использовать встроенное перечисление для раскрывающегося списка.

Если вы хотите привязать сам Enum, используйте это:

@Html.DropDownList("response", EnumHelper.GetSelectList(typeof(Response)))

Если вы привязываетесь к экземпляру Response, используйте это:

// Assuming Model.Response is an instance of Response
@Html.EnumDropDownListFor(m => m.Response)
0 голосов
/ 09 января 2017

Принятое решение не работает, но приведенный ниже код поможет другим, ищущим самое короткое решение.

 foreach (string value in Enum.GetNames(typeof(Response)))
                    ddlResponse.Items.Add(new ListItem()
                    {
                        Text = value,
                        Value = ((int)Enum.Parse(typeof(Response), value)).ToString()
                    });
0 голосов
/ 28 марта 2012

Вы также можете использовать методы расширения. Для тех, кто не знаком с расширениями, я рекомендую проверить документацию VB и C # .


VB Extension:

Namespace CustomExtensions
    Public Module ListItemCollectionExtension

        <Runtime.CompilerServices.Extension()> _
        Public Sub AddEnum(Of TEnum As Structure)(items As System.Web.UI.WebControls.ListItemCollection)
            Dim enumerationType As System.Type = GetType(TEnum)
            Dim enumUnderType As System.Type = System.Enum.GetUnderlyingType(enumType)

            If Not enumerationType.IsEnum Then Throw New ArgumentException("Enumeration type is expected.")

            Dim enumTypeNames() As String = System.Enum.GetNames(enumerationType)
            Dim enumTypeValues() As TEnum = System.Enum.GetValues(enumerationType)

            For i = 0 To enumTypeNames.Length - 1
                items.Add(New System.Web.UI.WebControls.ListItem(saveResponseTypeNames(i), TryCast(enumTypeValues(i), System.Enum).ToString("d")))
            Next
        End Sub
    End Module
End Namespace

Чтобы использовать расширение:

Imports <projectName>.CustomExtensions.ListItemCollectionExtension

...

yourDropDownList.Items.AddEnum(Of EnumType)()

C # Расширение:

namespace CustomExtensions
{
    public static class ListItemCollectionExtension
    {
        public static void AddEnum<TEnum>(this System.Web.UI.WebControls.ListItemCollection items) where TEnum : struct
        {
            System.Type enumType = typeof(TEnum);
            System.Type enumUnderType = System.Enum.GetUnderlyingType(enumType);

            if (!enumType.IsEnum) throw new Exception("Enumeration type is expected.");

            string[] enumTypeNames = System.Enum.GetNames(enumType);
            TEnum[] enumTypeValues = (TEnum[])System.Enum.GetValues(enumType);

            for (int i = 0; i < enumTypeValues.Length; i++)
            {
                items.add(new System.Web.UI.WebControls.ListItem(enumTypeNames[i], (enumTypeValues[i] as System.Enum).ToString("d")));
            }
        }
    }
}

Чтобы использовать расширение:

using CustomExtensions.ListItemCollectionExtension;

...

yourDropDownList.Items.AddEnum<EnumType>()

Если вы хотите установить выбранный элемент одновременно, замените

items.Add(New System.Web.UI.WebControls.ListItem(saveResponseTypeNames(i), saveResponseTypeValues(i).ToString("d")))

с

Dim newListItem As System.Web.UI.WebControls.ListItem
newListItem = New System.Web.UI.WebControls.ListItem(enumTypeNames(i), Convert.ChangeType(enumTypeValues(i), enumUnderType).ToString())
newListItem.Selected = If(EqualityComparer(Of TEnum).Default.Equals(selected, saveResponseTypeValues(i)), True, False)
items.Add(newListItem)

Преобразование в System.Enum, а не в размер int и проблемы с выходом исключается. Например, 0xFFFF0000 будет 4294901760 как uint, но будет -65536 как int.

TryCast и System.Enum немного быстрее Convert.ChangeType (enumTypeValues ​​[i], enumUnderType) .ToString () (12:13 в моих тестах скорости).

0 голосов
/ 13 октября 2011

Если вы хотите иметь более удобное для пользователя описание в поле со списком (или другим элементом управления), вы можете использовать атрибут Description со следующей функцией:

    public static object GetEnumDescriptions(Type enumType)
    {
        var list = new List<KeyValuePair<Enum, string>>();
        foreach (Enum value in Enum.GetValues(enumType))
        {
            string description = value.ToString();
            FieldInfo fieldInfo = value.GetType().GetField(description);
            var attribute = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false).First();
            if (attribute != null)
            {
                description = (attribute as DescriptionAttribute).Description;
            }
            list.Add(new KeyValuePair<Enum, string>(value, description));
        }
        return list;
    }

Вот пример перечисления с примененными атрибутами Description:

    enum SampleEnum
    {
        NormalNoSpaces,
        [Description("Description With Spaces")]
        DescriptionWithSpaces,
        [Description("50%")]
        Percent_50,
    }

Тогда привязывайся к контролю вот так ...

        m_Combo_Sample.DataSource = GetEnumDescriptions(typeof(SampleEnum));
        m_Combo_Sample.DisplayMember = "Value";
        m_Combo_Sample.ValueMember = "Key";

Таким образом, вы можете поместить любой текст в раскрывающемся списке без необходимости выглядеть как имя переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...