it-swarm-id.com

Bagaimana Anda mengikat kontrol Enum ke DropDownList di ASP.NET?

Katakanlah saya memiliki enum sederhana berikut:

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

Bagaimana saya bisa mengikat enum ini ke kontrol DropDownList sehingga deskripsi ditampilkan dalam daftar serta mengambil nilai numerik terkait (1,2,3) setelah opsi telah dipilih?

118
Ray Vega

Saya mungkin tidak akan bind data karena ini adalah enum, dan itu tidak akan berubah setelah waktu kompilasi (kecuali saya memiliki salah satu dari itu stoopid saat).

Lebih baik untuk beralih melalui enum:

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

Atau sama di 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);
}
107
Mark Glorie

Gunakan kelas utilitas berikut Enumeration untuk mendapatkan IDictionary<int,string> (pasangan nilai & pasangan nama) dari Enumeration; Anda kemudian mengikat IDictionary ke Kontrol bindable.

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

Contoh: Menggunakan kelas utilitas untuk mengikat data enumerasi ke kontrol

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

Saya menggunakan ini untuk 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() }))
40
Feryt

Versi saya hanyalah bentuk terkompresi dari yang di atas:

foreach (Response r in Enum.GetValues(typeof(Response)))
{
    ListItem item = new ListItem(Enum.GetName(typeof(Response), r), r.ToString());
    DropDownList1.Items.Add(item);
}
35
VanOrman
public enum Color
{
    RED,
    GREEN,
    BLUE
}

Setiap tipe Enum berasal dari System.Enum. Ada dua metode statis yang membantu mengikat data ke kontrol daftar drop-down (dan mengambil nilai). Ini adalah Enum.GetNames dan Enum.Parse. Menggunakan GetNames, Anda dapat mengikat kontrol daftar turun bawah Anda sebagai berikut:

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

Sekarang jika Anda ingin nilai Enum Kembali Seleksi ....

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

Setelah membaca semua posting saya datang dengan solusi komprehensif untuk mendukung menampilkan deskripsi enum dalam daftar dropdown serta memilih nilai yang tepat dari Model dalam dropdown saat ditampilkan dalam mode Edit:

enum:

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

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

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

enum kelas ekstensi:

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

Kelas model:

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

dan Lihat:

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

dan jika Anda menggunakan dropdown itu tanpa mengikat ke Model, Anda bisa menggunakan ini:

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

Jadi dengan melakukan itu, Anda dapat mengharapkan Deskripsi tampilan dropdown alih-alih nilai enum. Juga ketika datang ke Edit, model Anda akan diperbarui dengan dropdown nilai yang dipilih setelah halaman posting.

10
Amir Chatrbahr

Seperti yang sudah dikatakan orang lain - jangan databind ke enum, kecuali Anda perlu mengikat ke enum yang berbeda tergantung pada situasi. Ada beberapa cara untuk melakukan ini, beberapa contoh di bawah ini.

ObjectDataSource

Cara deklaratif untuk melakukannya dengan ObjectDataSource. Pertama, buat kelas BusinessObject yang akan mengembalikan Daftar untuk mengikat DropDownList ke:

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

Kemudian tambahkan beberapa markup HTML ke halaman ASPX untuk menunjuk ke kelas BO ini:

<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>

Opsi ini tidak memerlukan kode di belakang.

Code Behind DataBind

Untuk memperkecil HTML di halaman ASPX dan lakukan bind di 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()));
        }
    }
}

Bagaimanapun, triknya adalah membiarkan metode tipe Enum dari GetValues, GetNames, dll. Berfungsi untuk Anda.

8
Johan Danforth

Saya tidak yakin bagaimana melakukannya di ASP.NET tetapi periksa ini posting ... mungkin membantu?

Enum.GetValues(typeof(Response));
6
rudigrobler
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);
}
5
Adarsh

Anda bisa menggunakan 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();
5
KrishnaDhungana
public enum Color
{
    RED,
    GREEN,
    BLUE
}

ddColor.DataSource = Enum.GetNames(typeof(Color));
ddColor.DataBind();
4
sankalp gurha

Setelah menemukan jawaban ini saya menemukan apa yang saya pikir merupakan cara yang lebih baik (setidaknya lebih elegan) untuk melakukan ini, pikir saya akan kembali dan membagikannya di sini.

Page_Load:

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

Nilai Beban:

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

SaveValues:

Response rOut = (Response) Enum.Parse(typeof(Response), DropDownList1.Text);
3
Ben Hughes

Kode Generik Menggunakan Jawaban enam.

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
Muhammed Qasim

Ini mungkin pertanyaan lama .. tetapi ini adalah bagaimana saya melakukannya.

Model:

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
}

Kemudian di View: inilah cara menggunakan populate dropdown.

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

Ini harus mengisi semua yang ada di daftar enum Anda. Semoga ini membantu..

2
Marie McDonley
1
roman m

ASP.NET sejak itu telah diperbarui dengan beberapa fungsi lagi, dan sekarang Anda dapat menggunakan enum bawaan untuk dropdown.

Jika Anda ingin mengikat Enum itu sendiri, gunakan ini:

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

Jika Anda mengikat sebuah instance dari Respon, gunakan ini:

// Assuming Model.Response is an instance of Response
@Html.EnumDropDownListFor(m => m.Response)
1
bradlis7

Mengapa tidak menggunakan seperti ini untuk dapat melewati setiap 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);
1
Mostafa

Jika Anda ingin memiliki deskripsi yang lebih ramah pengguna di kotak kombo Anda (atau kontrol lain), Anda dapat menggunakan atribut Deskripsi dengan fungsi berikut:

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

Ini adalah contoh enum dengan atribut Deskripsi yang diterapkan:

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

Kemudian Bind untuk mengontrol seperti ...

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

Dengan cara ini Anda bisa meletakkan teks apa pun yang Anda inginkan di drop down tanpa harus terlihat seperti nama variabel

0
Josh Stribling

Baik asp.net maupun winforms tutorial dengan combobox dan dropdownlist: Cara menggunakan Enum dengan Combobox di C # WinForms dan Asp.Net

semoga membantu

0
justin

Lihat pos saya tentang membuat pembantu kustom "ASP.NET MVC - Membuat pembantu DropDownList untuk enum": http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp -net-mvc-create-a-dropdownlist-helper-for-enums.aspx

0
Stuart Leeks

Ini adalah solusi saya untuk Memesan Enum dan DataBind (Teks dan Nilai) ke Dropdown menggunakan LINQ

var mylist = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList<MyEnum>().OrderBy(l => l.ToString());
foreach (MyEnum item in mylist)
    ddlDivisao.Items.Add(new ListItem(item.ToString(), ((int)item).ToString()));
0
Diego Mendes

Solusi yang diterima tidak berfungsi, tetapi kode di bawah ini akan membantu orang lain mencari solusi terpendek.

 foreach (string value in Enum.GetNames(typeof(Response)))
                    ddlResponse.Items.Add(new ListItem()
                    {
                        Text = value,
                        Value = ((int)Enum.Parse(typeof(Response), value)).ToString()
                    });
0
Hakan Erdogan

Anda juga dapat menggunakan metode Ekstensi. Bagi mereka yang tidak terbiasa dengan ekstensi saya sarankan memeriksa dokumentasi VB dan C # .


Ekstensi 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

Untuk menggunakan ekstensi:

Imports <projectName>.CustomExtensions.ListItemCollectionExtension

...

yourDropDownList.Items.AddEnum(Of EnumType)()

C # Ekstensi:

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

Untuk menggunakan ekstensi:

using CustomExtensions.ListItemCollectionExtension;

...

yourDropDownList.Items.AddEnum<EnumType>()

Jika Anda ingin mengatur item yang dipilih sekaligus ganti

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

dengan

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)

Dengan mengkonversi ke System.Enum alih-alih masalah ukuran dan keluaran int dihindari. Misalnya 0xFFFF0000 akan menjadi 4294901760 sebagai uint tetapi akan menjadi -65536 sebagai int.

TryCast dan sebagai System.Enum sedikit lebih cepat daripada Convert.ChangeType (enumTypeValues ​​[i], enumUnderType) .ToString () (12:13 dalam tes kecepatan saya).

0
Trisped