假设我有以下简单的枚举:
enum Response
{
Yes = 1,
No = 2,
Maybe = 3
}
Run Code Online (Sandbox Code Playgroud)
如何将此枚举绑定到DropDownList控件,以便描述显示在列表中,并在选择选项后检索关联的数值(1,2,3)?
Mar*_*rie 107
我可能不会绑定数据,因为它是一个枚举,并且它不会在编译后更改(除非我有一个stoopid时刻).
最好只是迭代枚举:
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
Run Code Online (Sandbox Code Playgroud)
或者在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);
}
Run Code Online (Sandbox Code Playgroud)
Ley*_*eyu 69
使用以下实用程序类从枚举中Enumeration获取IDictionary<int,string>(枚举值和名称对); 然后将IDictionary绑定到可绑定的Control.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
示例:使用实用程序类将枚举数据绑定到控件
ddlResponse.DataSource = Enumeration.GetAll<Response>();
ddlResponse.DataTextField = "Value";
ddlResponse.DataValueField = "Key";
ddlResponse.DataBind();
Run Code Online (Sandbox Code Playgroud)
Fer*_*ryt 40
我将它用于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() }))
Run Code Online (Sandbox Code Playgroud)
Van*_*man 35
我的版本只是以上的压缩形式:
foreach (Response r in Enum.GetValues(typeof(Response)))
{
ListItem item = new ListItem(Enum.GetName(typeof(Response), r), r.ToString());
DropDownList1.Items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
小智 23
public enum Color
{
RED,
GREEN,
BLUE
}
Run Code Online (Sandbox Code Playgroud)
每个枚举类型都派生自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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你想要Enum值返回选择....
private void ddColor_SelectedIndexChanged(object sender, System.EventArgs e)
{
Color selectedColor = (Color)Enum.Parse(typeof(Color),ddColor.SelectedValue
}
Run Code Online (Sandbox Code Playgroud)
Ami*_*ahr 11
阅读完所有帖子后,我想出了一个全面的解决方案,支持在下拉列表中显示枚举描述,并在编辑模式下显示时从下拉列表中选择适当的值:
枚举:
using System.ComponentModel;
public enum CompanyType
{
[Description("")]
Null = 1,
[Description("Supplier")]
Supplier = 2,
[Description("Customer")]
Customer = 3
}
Run Code Online (Sandbox Code Playgroud)
枚举扩展类:
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))
});
}
}
Run Code Online (Sandbox Code Playgroud)
型号类:
public class Company
{
public string CompanyName { get; set; }
public CompanyType Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并查看:
@Html.DropDownListFor(m => m.Type,
@Model.Type.ToSelectList<CompanyType>())
Run Code Online (Sandbox Code Playgroud)
如果您使用该下拉列表而不绑定到Model,则可以使用此代码:
@Html.DropDownList("type",
Enum.GetValues(typeof(CompanyType)).Cast<CompanyType>()
.Select(x => new SelectListItem {Text = x.ToDescription(), Value = x.ToString()}))
Run Code Online (Sandbox Code Playgroud)
因此,通过这样做,您可以预期您的下拉列表显示描述而不是枚举值.此外,在编辑时,您的模型将在发布页面后通过下拉选择值进行更新.
正如其他人已经说过的那样 - 不要将数据绑定到枚举,除非您需要根据情况绑定到不同的枚举.有几种方法可以做到这一点,下面是几个例子.
ObjectDataSource控件
使用ObjectDataSource进行声明的声明方式.首先,创建一个BusinessObject类,它将返回List以将DropDownList绑定到:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后将一些HTML标记添加到ASPX页面以指向此BO类:
<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>
Run Code Online (Sandbox Code Playgroud)
此选项不需要后面的代码.
DataBind背后的代码
要最小化ASPX页面中的HTML并在Code Behind中进行绑定:
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()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,诀窍是让GetValues,GetNames等的Enum类型方法为你工作.
我不知道如何在ASP.NET中做到这一点,但看看这篇文章......它可能有帮助吗?
Enum.GetValues(typeof(Response));
Run Code Online (Sandbox Code Playgroud)
小智 5
Array itemValues = Enum.GetValues(typeof(TaskStatus));
Array itemNames = Enum.GetNames(typeof(TaskStatus));
for (int i = 0; i <= itemNames.Length; i++)
{
ListItem item = new ListItem(itemNames.GetValue(i).ToString(),
itemValues.GetValue(i).ToString());
ddlStatus.Items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
你可以使用linq:
var responseTypes= Enum.GetNames(typeof(Response)).Select(x => new { text = x, value = (int)Enum.Parse(typeof(Response), x) });
DropDownList.DataSource = responseTypes;
DropDownList.DataTextField = "text";
DropDownList.DataValueField = "value";
DropDownList.DataBind();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159667 次 |
| 最近记录: |