生活随笔
收集整理的這篇文章主要介紹了
将枚举值转换为DropDownList等的选项值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
應用場景:在項目中,我們已習慣將較穩定的分類標準定義為枚舉,來保證程序中取值的合法性,也使代碼更清晰。某些情況下我們需要在DropDownList等選擇控件上綁定某個枚舉的所有枚舉值,供用戶自行選擇,這時就需要將枚舉值轉換為DropDownList等的選項值。
?
最初遇到這種需求時,我隨手寫了個簡單的方法如下。
/// <summary>
/// 緊急程度
/// </summary>
public enum eOA_EmergencyLevel
{
/// <summary>/// 平件 /// </summary> 平件 = 1,
/// <summary>/// 急件 /// </summary> 急件 = 2
}
/// <summary>
/// 將枚舉轉換成ArrayList
/// </summary>
/// <returns></returns>
public static IList EnumToList(
Type enumType)
{
ArrayList list =
new ArrayList ();
foreach (
int i
in Enum .GetValues(enumType)){
ListItem listitem =
new ListItem (
Enum .GetName(enumType, i), i.ToString());list.Add(listitem);}
return list;
}
/// <summary>
/// 將枚舉轉換成下拉框
/// </summary>
public static void FillDropDownList(
DropDownList ddl,
Type enumType)
{ddl.Items.Clear();ddl.DataSource = EnumToList(enumType);ddl.DataValueField =
"value" ;ddl.DataTextField =
"text" ;ddl.DataBind();
}
?
后來,在同事討論代碼時,被大家批評為不該使用這種中文的枚舉名稱;同時我自己也覺得這種反射方式性能有問題。不過因為影響不大,一直懶得去理它。
最近看到了兩篇博文(枚舉的顯示和綁定和一個利用擴展方法的實例:AttachDataExtensions),是利用C# 3.0的擴展方法實現的,實現得很是優美,可惜我們的項目基于.NET 2.0,用不上。但受此啟發,便花了點時間使用Attribute和緩存的技術重構了原來的代碼。
/// <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 enum eOA_EmergencyLevel
{
/// <summary>/// 平件 /// </summary> [
EnumShowName (
"平件" )]Common = 1,
/// <summary>/// 急件 /// </summary> [
EnumShowName (
"急件" )]Emergency = 2
}
/// <summary>
/// 枚舉工具類
/// </summary>
public sealed class EnumUtil
{
private static Dictionary <
string ,
Dictionary <
int ,
string >> _EnumList =
new Dictionary <
string ,
Dictionary <
int ,
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<int, string> /// 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];}
/// <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];}
}?想更偷懶的話,還可以省掉自定義的EnumShowNameAttribute,直接用System.ComponentModel.DescriptionAttribute就行了。
?
[附]Enum基礎知識:
c# 枚舉 enum .NET中Flags枚舉的使用 關于枚舉的種種 (Enumeration FAQ) [C#, IL, BCL]
轉載于:https://www.cnblogs.com/wenjian/archive/2009/06/19/1506550.html
總結
以上是生活随笔 為你收集整理的将枚举值转换为DropDownList等的选项值 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。