程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> DropDownList綁定枚舉類型

DropDownList綁定枚舉類型

編輯:.NET實例教程

很多的時候需要把枚舉作為數據源綁定DropDownList,一直簡單的做法是:


 1    /**//// <summary>
 2    /// 排序方向下拉列表,從DropDownList繼承
 3    /// </summary>
 4    public class SortOrderDropDownList : DropDownList
 5    {
 6        public SortOrderDropDownList() 
 7        {
 8            Items.Add(new ListItem("降序", ((int) SortOrder.Descending).ToString()));
 9            Items.Add(new ListItem("升序", ((int) SortOrder.Ascending).ToString()));
10        }
11
12        /**//// <summary>
13        /// 自定義DropDownList的屬性SelectedValue
14        /// </summary>
15        public new SortOrder SelectedValue 
16       {
17            get { return (SortOrder) int.Parse(base.SelectedValue); }
18            set 
19            
20                Items.FindByValue( base.SelectedValue ).Selected = false;
21                Items.FindByValue( ((int) value).ToString() ).Selected = true; 
22            }
23        }
24    }用的時候呢,和普通的DropDownList是一樣的,這裡就不贅述了.
今天做項目遇到了一個新的情況,需要一個民族選擇的下拉菜單,這下可有點麻煩了,56個民族啊,那不是要寫56行一樣的東東?#$%^&*.想用Html控件,把值全部寫在Html裡面吧,還是覺得有點麻煩.想到了一個原來的同事阿哲寫的一篇用反射+特性列出所有的枚舉變量及其描述信息,綁定到DropDownList上,參考了一下,這個思路真好~!下面看看我的:
定義枚舉的時候如上文的終極解決方案所述,將枚舉定義加上它的特性說明,如本例所用到的民族枚舉:

    public enum Folk
    {
        [Description("漢族")]
        HanZu,
        [Description("回族")]
        Huizi,
        [Description("蒙古族")]
        Menggu,
        [Description("朝鮮族")]
    ChaoXian,
        [Description("他們族")]
        TaMen
    }
1.從枚舉類型和它的特性讀出並返回一個鍵值對

 1        /**//// <summary>
 2        /// 從枚舉類型和它的特性讀出並返回一個鍵值對
 3        /// </summary>
 4        /// <param name="enumType">Type,該參數的格式為typeof(需要讀的枚舉類型)</param>
 5        /// <returns>鍵值對</returns>
 6        public static NameValueCollection GetNVCFromEnumValue(Type enumType)
 7        {
 8            NameValueCollection nvc = new NameValueCollection();
 9            Type typeDescription = typeof(DescriptionAttribute);
10            System.Reflection.FieldInfo[] fields = enumType.GetFIElds();
11            string strText = string.Empty;
12            string strValue = string.Empty;
13            foreach(FieldInfo field in fIElds)
14            {
15                if(field.FIEldType.IsEnum&nbsp;== true)
16                {
17                    strValue = ((int)enumType.InvokeMember(field.Name,BindingFlags.GetFIEld,null,null,null)).ToString();
18                    object[] arr = fIEld.GetCustomAttributes(typeDescription,true);
19                    if(arr.Length > 0)
20                    {
21                        DescriptionAttribute aa = (DescriptionAttribute)arr[0];
22                        strText = aa.Description;
23                    }
24                    else
25                    {
26                        strText = fIEld.Name;
27                    }
28                    nvc.Add(strText,strValue);
29                }
30            }
31        return nvc;
32        }
這個方法可以看看阿哲的文章中的說明,講的很清楚了.不同的是一個是DataTable,一個是NameValueCollection而已.

2.從枚舉類型和它的特性說明及枚舉值取得該枚舉的特性說明字符串

 1
 2        /**//// <summary>
 3        /// 從枚舉類型和它的特性說明及枚舉值取得該枚舉的特性說明字符串
 4        /// </summary>
 5        /// <param name="enumType">枚舉類型typeof(需要讀的枚舉類型)</param>
 6        /// <param name="index">枚舉的值</param>
 7        /// <returns>枚舉的特性說明</returns>
 8        public static string GetDescriptionFromNVC(Type enumType,int index)
 9        {
10            string description = string.Empty;
11            NameValueCollection nvc = GetNVCFromEnumValue(enumType);
12            description = nvc.Keys[index];
13            return description;
14        }到了這裡,綁定起來相對就容易一點了.代碼如下,大家都比較反對僅僅羅列代碼的文章,但有些問題似乎是只有代碼能說的明白一點,所以只有再帖一點了:-)

    public class FolkDropDownList : DropDownList
    {
   public FolkDropDownList(){}
        public override void DataBind()
        {
            base.DataBind ();
            if(!Page.IsPostBack)
            {
                NameValueCollection nvc = GetNVCFromEnumValue(typeof(Folk));
                for(int i = 0;i < nvc.Count;i++)
                {
                    Items.Add(new ListItem(nvc.Keys[i],nvc[i]));
                }
            }
        }

        public new Folk SelectedValue 
     {
            get { return (Folk) int.Parse(base.SelectedValue); }
            set { base.SelectedValue = ((int) value).ToString(); }
        }
    }至於用的時候呢,也比較簡單了.代碼中加了一些說明可以參考一下.

 1        private void Page_Load(object sender, System.EventArgs e)
 2        {
                   //測試用,將該DropDownList的AutoPostBack設為true.
 3            this.flokthis.AutoPostBack = true;
 4            this.DataBind();

                    //這裡就從民族枚舉中取得鍵值對,當選擇一項的時候讀出所選的值 5
 6            NameValueCollection nvc = GetNVCFromEnumValue(typeof(Folk));
 7            Response.Write(this.flokthis.SelectedValue.ToString());

                  //這裡讀出所選枚舉的特性說明字符串
 9            Response.Write(nvc.Keys[int.Parse(flokthis.SelectedValue)]);

10            //如果從數據庫中讀出的如0.1.2.3等的值,取得它對應的枚舉的特性說明.
11            string testNVCvoid = string.Empty;
12      Response.Write(GetDescriptionFromNVC(typeof(Folk),int.Parse(flokthis.SelectedValue)));
13        }到這裡,問題解決了.我的文章也完了.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved