C#枚舉類型綁定下拉列表框

 

//======================================================================  
// 版權所有:Copyright (C) 2010
// 版    本:2.0.50727.3615
// 文件名稱:EnumToCollections
// 模塊名稱:
// 功    能:
//         
//
//
// 作    者:// 創建時間:2011/3/25 15:28:18
// 修改時間:
//======================================================================
using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;

    /// <summary>
    /// 枚舉的顯示名稱
    /// </summary>
    [global::System.AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
    public sealed class EnumShowNameAttribute : Attribute
    {
        private string showName;

        /// <summary>
        /// 顯示名稱
        /// </summary>
        public string ShowName
        {
            get
            {
                return this.showName;
            }
        }

        /// <summary>
        /// 構造枚舉的顯示名稱
        /// </summary>
        /// <param name="showName">顯示名稱</param>
        public EnumShowNameAttribute(string showName)
        {
            this.showName = showName;
        }
    }

 


    /// <summary>
    /// 枚舉工具類
    /// </summary>
    public sealed class EnumUtil
    {
        private static Dictionary<string, Dictionary<int, string>> _EnumList = new Dictionary<string, Dictionary<int, string>>(); //枚舉緩存池
        private static Dictionary<string, Dictionary<long, string>> _LEnumList = new Dictionary<string, Dictionary<long, string>>(); //枚舉緩存池
        /// <summary>
        /// 將枚舉綁定到ListControl
        /// </summary>
        /// <param name="listControl">ListControl</param>
        /// <param name="enumType">枚舉類型</param>
        public static void FillListControl(ListControl listControl, Type enumType)
        {
            listControl.Items.Clear();
            listControl.DataSource = EnumToDictionary(enumType);
            listControl.DataValueField = "key";
            listControl.DataTextField = "value";
            listControl.DataBind();
        }

        /// <summary>
        /// 將枚舉轉換成Dictionary&lt;int, string&gt;
        /// Dictionary中,key爲枚舉項對應的int值;value爲:若定義了EnumShowName屬性,則取它,否則取name
        /// </summary>
        /// <param name="enumType">枚舉類型</param>
        /// <returns></returns>
        public static Dictionary<int, string> EnumToDictionary(Type enumType)
        {
            string keyName = enumType.FullName;

            if (!_EnumList.ContainsKey(keyName))
            {
                Dictionary<int, string> list = new Dictionary<int, string>();

                foreach (int i in Enum.GetValues(enumType))
                {
                    string name = Enum.GetName(enumType, i);

                    //取顯示名稱
                    string showName = string.Empty;
                    object[] atts = enumType.GetField(name).GetCustomAttributes(typeof(EnumShowNameAttribute), false);
                    if (atts.Length > 0) showName = ((EnumShowNameAttribute)atts[0]).ShowName;

                    list.Add(i, string.IsNullOrEmpty(showName) ? name : showName);
                }

                object syncObj = new object();

                if (!_EnumList.ContainsKey(keyName))
                {
                    lock (syncObj)
                    {
                        if (!_EnumList.ContainsKey(keyName))
                        {
                            _EnumList.Add(keyName, list);
                        }
                    }
                }
            }

            return _EnumList[keyName];
        }
        public static Dictionary<long, string> LEnumToDictionary(Type enumType)
        {
            string keyName = enumType.FullName;

            if (!_LEnumList.ContainsKey(keyName))
            {
                Dictionary<long, string> list = new Dictionary<long, string>();

                foreach (long i in Enum.GetValues(enumType))
                {
                    string name = Enum.GetName(enumType, i);

                    //取顯示名稱
                    string showName = string.Empty;
                    object[] atts = enumType.GetField(name).GetCustomAttributes(typeof(EnumShowNameAttribute), false);
                    if (atts.Length > 0) showName = ((EnumShowNameAttribute)atts[0]).ShowName;

                    list.Add(i, string.IsNullOrEmpty(showName) ? name : showName);
                }

                object syncObj = new object();

                if (!_LEnumList.ContainsKey(keyName))
                {
                    lock (syncObj)
                    {
                        if (!_LEnumList.ContainsKey(keyName))
                        {
                            _LEnumList.Add(keyName, list);
                        }
                    }
                }
            }

            return _LEnumList[keyName];
        }
        /// <summary>
        /// 獲取枚舉值對應的顯示名稱
        /// </summary>
        /// <param name="enumType">枚舉類型</param>
        /// <param name="intValue">枚舉項對應的int值</param>
        /// <returns></returns>
        public static string GetEnumShowName(Type enumType, int intValue)
        {
            return EnumToDictionary(enumType)[intValue];

        }
        public static string GetLEnumShowName(Type enumType, long intValue)
        {
            return LEnumToDictionary(enumType)[intValue];
        }

    }

上面爲公共類

//======================================================================  
// 版權所有:Copyright (C)  2010
// 版    本:2.0.50727.3615
// 文件名稱:EmunCardState
// 模塊名稱:
// 功    能:該枚舉不可更改
//         
//
//
// 作    者:

// 創建時間:2011/5/13 11:13:14
// 修改時間:
//======================================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public enum EnumCardState : long
{

    [EnumShowName("生產")]
    GanerCarNo = 1,

    [EnumShowName("加工")]
    CardApply = 2,


  }


 以上爲枚舉類型

///綁定下拉列表信息

  private void DataBindList()
    {
        ddlList.DataSource = EnumUtil.LEnumToDictionary(typeof(EnumCardState));
        ddlList.DataTextField = "value";
        ddlList.DataValueField = "key";

        ddlList.DataBind();
    }

///列出相應的名稱
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = EnumUtil.GetLEnumShowName(typeof(EnumCardState), int.Parse(ddlList.SelectedValue));
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章