很多的時候需要把枚舉作為數據源綁定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
}到這裡,問題解決了.我的文章也完了.