[C#] ASP.NET에서 Enum을 DropDownList 컨트롤에 어떻게 바인딩합니까?

다음과 같은 간단한 열거 형이 있다고 가정 해 보겠습니다.

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

이 열거 형을 DropDownList 컨트롤에 바인딩하여 옵션이 선택되면 설명이 목록에 표시되고 관련 숫자 값 (1,2,3)을 검색하도록하려면 어떻게해야합니까?



답변

나는 아마도 열거 형이기 때문에 데이터를 바인딩 하지 않을 것이며 컴파일 시간 후에 변경되지 않을 것입니다 (그 멍청한 순간 중 하나가 있지 않는 한 ).

열거 형을 반복하는 것이 좋습니다.

Dim itemValues As Array = System.Enum.GetValues(GetType(Response))
Dim itemNames As Array = System.Enum.GetNames(GetType(Response))

For i As Integer = 0 To itemNames.Length - 1
    Dim item As New ListItem(itemNames(i), itemValues(i))
    dropdownlist.Items.Add(item)
Next

또는 C #에서 동일

Array itemValues = System.Enum.GetValues(typeof(Response));
Array itemNames = System.Enum.GetNames(typeof(Response));

for (int i = 0; i <= itemNames.Length - 1 ; i++) {
    ListItem item = new ListItem(itemNames[i], itemValues[i]);
    dropdownlist.Items.Add(item);
}


답변

다음 유틸리티 클래스 Enumeration를 사용하여 열거 형IDictionary<int,string> 에서 (열거 형 값 및 이름 쌍) 을 가져옵니다 . 그런 다음 IDictionary 를 바인딩 가능한 컨트롤에 바인딩합니다.

public static class Enumeration
{
    public static IDictionary<int, string> GetAll<TEnum>() where TEnum: struct
    {
        var enumerationType = typeof (TEnum);

        if (!enumerationType.IsEnum)
            throw new ArgumentException("Enumeration type is expected.");

        var dictionary = new Dictionary<int, string>();

        foreach (int value in Enum.GetValues(enumerationType))
        {
            var name = Enum.GetName(enumerationType, value);
            dictionary.Add(value, name);
        }

        return dictionary;
    }
}

예 : 유틸리티 클래스를 사용하여 열거 형 데이터를 컨트롤에 바인딩

ddlResponse.DataSource = Enumeration.GetAll<Response>();
ddlResponse.DataTextField = "Value";
ddlResponse.DataValueField = "Key";
ddlResponse.DataBind();


답변

나는 이것을 ASP.NET MVC에 사용합니다 .

Html.DropDownListFor(o => o.EnumProperty, Enum.GetValues(typeof(enumtype)).Cast<enumtype>().Select(x => new SelectListItem { Text = x.ToString(), Value = ((int)x).ToString() }))


답변

내 버전은 위의 압축 형식 일뿐입니다.

foreach (Response r in Enum.GetValues(typeof(Response)))
{
    ListItem item = new ListItem(Enum.GetName(typeof(Response), r), r.ToString());
    DropDownList1.Items.Add(item);
}


답변

public enum Color
{
    RED,
    GREEN,
    BLUE
}

모든 Enum 형식은 System.Enum에서 파생됩니다. 드롭 다운 목록 컨트롤에 데이터를 바인딩하고 값을 검색하는 데 도움이되는 두 가지 정적 메서드가 있습니다. 이들은 Enum.GetNames 및 Enum.Parse입니다. GetNames를 사용하면 다음과 같이 드롭 다운 목록 컨트롤에 바인딩 할 수 있습니다.

protected System.Web.UI.WebControls.DropDownList ddColor;

private void Page_Load(object sender, System.EventArgs e)
{
     if(!IsPostBack)
     {
        ddColor.DataSource = Enum.GetNames(typeof(Color));
        ddColor.DataBind();
     }
}

이제 Enum 값을 다시 선택하려면 ….

  private void ddColor_SelectedIndexChanged(object sender, System.EventArgs e)
  {
    Color selectedColor = (Color)Enum.Parse(typeof(Color),ddColor.SelectedValue
  }


답변

모든 게시물을 읽은 후 드롭 다운 목록에 열거 형 설명을 표시하고 편집 모드에서 표시 할 때 드롭 다운의 모델에서 적절한 값을 선택하는 것을 지원하는 포괄적 인 솔루션을 찾았습니다.

열거 형 :

using System.ComponentModel;
public enum CompanyType
{
    [Description("")]
    Null = 1,

    [Description("Supplier")]
    Supplier = 2,

    [Description("Customer")]
    Customer = 3
}

열거 형 확장 클래스 :

using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web.Mvc;

public static class EnumExtension
{
    public static string ToDescription(this System.Enum value)
    {
        var attributes = (DescriptionAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
        return attributes.Length > 0 ? attributes[0].Description : value.ToString();
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this System.Enum enumValue)
    {
        return
            System.Enum.GetValues(enumValue.GetType()).Cast<T>()
                  .Select(
                      x =>
                      new SelectListItem
                          {
                              Text = ((System.Enum)(object) x).ToDescription(),
                              Value = x.ToString(),
                              Selected = (enumValue.Equals(x))
                          });
    }
}

모델 클래스 :

public class Company
{
    public string CompanyName { get; set; }
    public CompanyType Type { get; set; }
}

및보기 :

@Html.DropDownListFor(m => m.Type,
@Model.Type.ToSelectList<CompanyType>())

모델에 바인딩하지 않고 해당 드롭 다운을 사용하는 경우 대신 다음을 사용할 수 있습니다.

@Html.DropDownList("type",
Enum.GetValues(typeof(CompanyType)).Cast<CompanyType>()
.Select(x => new SelectListItem {Text = x.ToDescription(), Value = x.ToString()}))

이렇게하면 드롭 다운에 열거 형 값 대신 설명이 표시됩니다. 또한 편집의 경우 페이지 게시 후 선택한 값을 드롭 다운하여 모델이 업데이트됩니다.


답변

다른 사람들이 이미 말했듯이-상황에 따라 다른 열거 형에 바인딩 할 필요가없는 한 열거 형에 데이터 바인딩하지 마십시오. 이를 수행하는 방법에는 여러 가지가 있으며 아래에 몇 가지 예가 있습니다.

ObjectDataSource

ObjectDataSource로이를 수행하는 선언적 방법입니다. 먼저, DropDownList를 바인드하기 위해 List를 리턴하는 BusinessObject 클래스를 작성하십시오.

public class DropDownData
{
    enum Responses { Yes = 1, No = 2, Maybe = 3 }

    public String Text { get; set; }
    public int Value { get; set; }

    public List<DropDownData> GetList()
    {
        var items = new List<DropDownData>();
        foreach (int value in Enum.GetValues(typeof(Responses)))
        {
            items.Add(new DropDownData
                          {
                              Text = Enum.GetName(typeof (Responses), value),
                              Value = value
                          });
        }
        return items;
    }
}

그런 다음이 BO 클래스를 가리 키도록 ASPX 페이지에 HTML 마크 업을 추가합니다.

<asp:DropDownList ID="DropDownList1" runat="server"
    DataSourceID="ObjectDataSource1" DataTextField="Text" DataValueField="Value">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetList" TypeName="DropDownData"></asp:ObjectDataSource>

이 옵션에는 뒤에 코드가 필요하지 않습니다.

DataBind 뒤의 코드

ASPX 페이지에서 HTML을 최소화하고 코드 숨김에서 바인딩하려면 :

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

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        foreach (int value in Enum.GetValues(typeof(Responses)))
        {
            DropDownList1.Items.Add(new ListItem(Enum.GetName(typeof(Responses), value), value.ToString()));
        }
    }
}

어쨌든 트릭은 GetValues, GetNames 등의 Enum 유형 메서드가 작동하도록하는 것입니다.