当前位置:  开发笔记 > 编程语言 > 正文

如何将Enum绑定到ASP.NET中的DropDownList控件?

如何解决《如何将Enum绑定到ASP.NET中的DropDownList控件?》经验,为你挑选了10个好方法。

假设我有以下简单的枚举:

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

如何将此枚举绑定到DropDownList控件,以便描述显示在列表中,并在选择选项后检索关联的数值(1,2,3)?



1> Mark Glorie..:

我可能不会绑定数据,因为它是一个枚举,并且它不会在编译后更改(除非我有一个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

或者在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);
}


通过在C#的方式,你不能访问与索引itemNames的[I],你只能用arrayObject.GetValue(我)做到这一点,并以这种方式,它的返回只是在两种情况下,名称数组.
为什么会有这么多的赞成.代码(至少c#)现在可以工作并包含语法错误.
使用C#,它对我不起作用,因为getValues和getNames都返回相同,第一个像对象,第二个像字符串.枚举的定义如下:public enum eResult {Right = 1,NoncontrolledError = 2,}

2> Leyu..:

使用以下实用程序类从枚举中Enumeration获取IDictionary(枚举值和名称对); 然后将IDictionary绑定到可绑定的Control.

public static class Enumeration
{
    public static IDictionary GetAll() where TEnum: struct
    {
        var enumerationType = typeof (TEnum);

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

        var dictionary = new Dictionary();

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

        return dictionary;
    }
}

示例:使用实用程序类将枚举数据绑定到控件

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



3> Feryt..:

我将它用于ASP.NET MVC:

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


有点凌乱,但很好的一个班轮,谢谢:-)

4> VanOrman..:

我的版本只是以上的压缩形式:

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


应该是(int in Enum.GetValues(typeof(Response)))或它只是将描述绑定为名称和值...
这不起作用,因为它在ListItem的值中插入了枚举成员的名称。转换为int在大多数情况下都可以,但是如果枚举是uint,ulong或long,则不行。

5> 小智..:
public enum Color
{
    RED,
    GREEN,
    BLUE
}

每个枚举类型都派生自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
  }



6> Amir Chatrba..:

阅读完所有帖子后,我想出了一个全面的解决方案,支持在下拉列表中显示枚举描述,并在编辑模式下显示时从下拉列表中选择适当的值:

枚举:

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 ToSelectList(this System.Enum enumValue)
    {
        return
            System.Enum.GetValues(enumValue.GetType()).Cast()
                  .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())

如果您使用该下拉列表而不绑定到Model,则可以使用此代码:

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

因此,通过这样做,您可以预期您的下拉列表显示描述而不是枚举值.此外,在编辑时,您的模型将在发布页面后通过下拉选择值进行更新.



7> Johan Danfor..:

正如其他人已经说过的那样 - 不要将数据绑定到枚举,除非您需要根据情况绑定到不同的枚举.有几种方法可以做到这一点,下面是几个例子.

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

然后将一些HTML标记添加到ASPX页面以指向此BO类:




此选项不需要后面的代码.

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()));
        }
    }
}

无论如何,诀窍是让GetValues,GetNames等的Enum类型方法为你工作.



8> rudigrobler..:

我不知道如何在ASP.NET中做到这一点,但看看这篇文章......它可能有帮助吗?

Enum.GetValues(typeof(Response));



9> 小智..:
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);
}



10> KrishnaDhung..:

你可以使用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();

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有