很多的時候需要把枚舉作為數據源綁定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 == 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

}到這裡,問題解決了.我的文章也完了.