답변:
나는 아마도 열거 형이기 때문에 데이터를 바인딩 하지 않을 것이며 컴파일 시간 후에 변경되지 않을 것입니다 (그 멍청한 순간 중 하나가 있지 않는 한 ).
열거 형을 반복하는 것이 좋습니다.
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();
내 버전은 위의 압축 형식 일뿐입니다.
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 유형 메서드가 작동하도록하는 것입니다.
ASP.NET에서 수행하는 방법을 잘 모르겠지만 확인하십시오. 이 게시물을 도움이 될까요?
Enum.GetValues(typeof(Response));
public enum Color
{
RED,
GREEN,
BLUE
}
ddColor.DataSource = Enum.GetNames(typeof(Color));
ddColor.DataBind();
답변 6을 사용한 일반 코드.
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();
}
이 대답을 찾은 후 나는 이것을하는 더 나은 (적어도 더 우아한) 방법이라고 생각하고 여기에 다시 와서 공유 할 것이라고 생각했습니다.
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);
이것은 아마도 오래된 질문 일 것입니다. 그러나 이것이 제가 어떻게했는지입니다.
모델:
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" })
이것은 열거 형 목록의 모든 항목을 채워야합니다. 도움이 되었기를 바랍니다..
[Display(Name = "Option number one")] Option1,
그것은 당신이 찾고있는 것이 아니지만 도움이 될 수 있습니다.
http://blog.jeffhandley.com/archive/2008/01/27/enum-list-dropdown-control.aspx
다음과 같이 사용하여 모든 listControle을 전달할 수있는 이유는 무엇입니까?
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();
}
그리고 사용은 다음과 같이 간단합니다.
BindToEnum(typeof(NewsType), DropDownList1);
BindToEnum(typeof(NewsType), CheckBoxList1);
BindToEnum(typeof(NewsType), RadoBuuttonList1);
ASP.NET은 이후 더 많은 기능으로 업데이트되었으며 이제 기본 제공 열거 형을 사용하여 드롭 다운 할 수 있습니다.
Enum 자체에 바인딩하려면 다음을 사용하십시오.
@Html.DropDownList("response", EnumHelper.GetSelectList(typeof(Response)))
Response 인스턴스에 바인딩하는 경우 다음을 사용하십시오.
// Assuming Model.Response is an instance of Response
@Html.EnumDropDownListFor(m => m.Response)
사용자 지정 도우미 "ASP.NET MVC-열거 형에 대한 DropDownList 도우미 만들기"에 대한 내 게시물을 확인하십시오. http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc -dropdownlist-helper-for-enums.aspx 만들기
콤보 상자 (또는 기타 컨트롤)에보다 사용자 친화적 인 설명을 포함하려면 다음 함수와 함께 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;
}
다음은 설명 속성이 적용된 열거 형의 예입니다.
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";
이렇게하면 변수 이름처럼 보이지 않아도 원하는 텍스트를 드롭 다운에 넣을 수 있습니다.
확장 메서드를 사용할 수도 있습니다. 확장 기능이 익숙하지 않은 사람들을 위해 VB 및 C # 문서를 확인하는 것이 좋습니다 .
VB 확장 :
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은 uint로 4294901760이지만 int로 -65536이됩니다.
TryCast 및 System.Enum은 Convert.ChangeType (enumTypeValues [i], enumUnderType) .ToString () (내 속도 테스트에서는 12:13)보다 약간 빠릅니다.
asp.net 및 winforms 자습서 (콤보 상자 및 드롭 다운 목록 포함) : C # WinForms 및 Asp.Net에서 Combobox와 함께 Enum을 사용하는 방법
희망이 도움이된다
훨씬 더 짧게 할 수 있습니다.
public enum Test
{
Test1 = 1,
Test2 = 2,
Test3 = 3
}
class Program
{
static void Main(string[] args)
{
var items = Enum.GetValues(typeof(Test));
foreach (var item in items)
{
//Gives you the names
Console.WriteLine(item);
}
foreach(var item in (Test[])items)
{
// Gives you the numbers
Console.WriteLine((int)item);
}
}
}