Skip to main content

C#: How to bind an Enum to a ListBox/DropDownList/ Checkboxlist control in ASP.NET?

There have been requirements where we need to bind ListControl from enum (with enum Description as Text and enum value as Value).

For example I have an enum of Countries as follows:

public enum TestCountries
{
    [Description("India")] India = 1
    ,
    [Description("United State Of America")] UnitedStateOfAmerica = 2
    ,
    [Description("United Kingdom")] UnitedKingdom = 3
}

And I want to bind this enum’s description and value to any list control.

Here I am writing a static method “LoadListForListControls<T>”, which will take Enum as T, and then return list of ListItem.

// We need to use following namespaces for this method:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Web.UI.WebControls;

public static List<ListItem> LoadListForListControls<T>()
{
    var type = typeof(T);
    var list = new List<ListItem>();
    foreach (var value in Enum.GetValues(type))
    {
        var enumValue = (Int32)value;
        var fi = value.GetType().GetField(value.ToString());
        var customAttributes =
                    fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
        DescriptionAttribute attribute = null;
        if (customAttributes.Length > 0)
                    attribute = (DescriptionAttribute)customAttributes[0];
        var item = new ListItem
                       {
                           Text = attribute != null
                                      ? attribute.Description
                                      : Enum.GetName(type, enumValue),
                           Value = (Convert.ToInt32(enumValue)).ToString()
                       };

        list.Add(item);
    }

    return list;
}

Usage:
So our method is ready, To use it let’s take a dropdown list:

<asp:DropDownList runat="server" ID="ddlCountries" />

Now in code behind C# let’s create a method which takes two parameters first as ListControl, and second list of ListItems and this method will then bind the provided list control.(Note: I have made this generic function to work with all list controls, you can modify as per your convenience).

private static void BindListControl(ListControl ctrl, List<ListItem> list)
{
    ctrl.DataSource = list;
    ctrl.DataTextField = "Text";
    ctrl.DataValueField = "Value";
    ctrl.DataBind();
}

Just pass the name of the list control(in this case "ddlCountries") as first parameter and in second parameter call "LoadListForListControls” method to get list as:

BindListControl(ddlCountries, LoadListForListControls<TestCountries>());

Same way you can bind Listbox/Checkboxlist/Radiobuttonlist by same BindListControl” method.

Hope it helps!!!

Comments