在我们进行的项目开发中,经常会遇到类似“状态(status)”这样的“常量”吧。比如说用户的状态可以简单的分为:正常,异常或者注销三类。如果没有事先定义好,或者定义好了,开发人员记忆混淆了,很可能就会造成错误,那么怎么样才能避免这样简单的错误呢。应该首先想到的是枚举,定义死了,以后开发人员用的时候就会去调用那个枚举就好了,关于枚举的好处就不说了,网上好多的。枚举定义好了,那么如何绑定到下拉的列表呢,在网上上收集了一些资料,现在整理如下:
首先,定义一个类型自定义属性(Attribute)
这个类是用来定义枚举中的自定义属性的,我们定义了两个属性,一个是描述,还有一个是值,分别表示下拉中的显示值和value值
public class EnumDescription : Attribute { readonly string description; readonly string value; public EnumDescription(string description,string value) { this.description = description; this.value = value; } /// <summary> /// 枚举描述 /// </summary> public string Description { get { return description; } } /// <summary> /// 枚举值 /// </summary> public string Value { get { return value; } } }
第二步,确定枚举
在这个枚举中使用了我们自定义的枚举属性
/// <summary> /// 用户角色 /// </summary> public enum UserRole { [EnumDescription("普通用户","1")] Member =1, [EnumDescription("公司","2")] Company = 2, [EnumDescription("超级管理员","5")] WebSiteManager =3 }
第三步,我们封装了一个方法,利用反射的技术,将数据绑定到下拉列表中
这个是摘自网名为阿松的人的代码,经过自己简单的修改后得到的,下面有两个方法,一个是用来绑定下拉列表的,还有一个是用来转换数据库中的值和要显示的值的
public class EnumBind { /// <summary> /// 用枚举绑定列表 /// 作者:阿松 /// </summary> /// <param name="col">控件名</param> /// <param name="eumeName">枚举名</param> /// <param name="eumeName">是否显示全部</param> public void ControlBindData(Control col, string enumName,bool showAll) { System.Reflection.Assembly asm = Assembly.Load("App_Code"); //枚举是在App_Code里 Type type = asm.GetType(enumName); FieldInfo[] fields = type.GetFields(); int count = fields.Length; if (col is DropDownList) { DropDownList ddl = (DropDownList)col; ddl.Items.Clear(); if (showAll)//是否显示“全部” { ddl.Items.Add(new ListItem("全部", "")); } for (int i = 1; i < count; i++) { FieldInfo field = fields[i]; string key = String.Empty; string value = String.Empty; var attr = field.GetCustomAttributes(false) ; foreach (Attribute a in attr) { if (a is EnumDescription) { key = ((EnumDescription)a).Description; value = ((EnumDescription)a).Value; } } / ListItem item = new ListItem(key,value); ddl.Items.Add(item); } } else if (col is HtmlSelect) { HtmlSelect ddl = (HtmlSelect)col; ddl.Items.Clear(); for (int i = 1; i < count; i++) { FieldInfo field = fields[i]; ListItem item = new ListItem(field.Name); ddl.Items.Add(item); } } else if (col is CheckBoxList) { CheckBoxList ddl = (CheckBoxList)col; ddl.Items.Clear(); for (int i = 1; i < count; i++) { FieldInfo field = fields[i]; ListItem item = new ListItem(field.Name); ddl.Items.Add(item); } } else if (col is RadioButtonList) { RadioButtonList ddl = (RadioButtonList)col; ddl.Items.Clear(); for (int i = 1; i < count; i++) { FieldInfo field = fields[i]; ListItem item = new ListItem(field.Name); ddl.Items.Add(item); } } else if (col is ListBox) { ListBox ddl = (ListBox)col; ddl.Items.Clear(); for (int i = 1; i < count; i++) { FieldInfo field = fields[i]; ListItem item = new ListItem(field.Name); ddl.Items.Add(item); } } } /// <summary> /// 枚举转换 将值转换为描述 /// </summary> /// <returns></returns> public static string Shift(string enumName,string myvalue) { System.Reflection.Assembly asm = Assembly.Load("App_Code"); //枚举是在App_Code里 Type type = asm.GetType(enumName); FieldInfo[] fields = type.GetFields(); for (int i = 1; i < fields.Count(); i++) { FieldInfo field = fields[i]; var attr = field.GetCustomAttributes(false); foreach (Attribute a in attr) { if (a is EnumDescription) { string key = ((EnumDescription)a).Description; string value = ((EnumDescription)a).Value; if (value.Equals(myvalue.Trim())) { return key; } } } } return ""; }
第四步,在后台代码中使用
new EnumBind().ControlBindData(ddl_role, "MyCar.Web.UserRole",true); 绑定下拉列表的
<%# EnumBind.Shift("MyCar.Web.UserRole", ((User)Container.DataItem).role)%> 这是在aspx页面中转换数据中的值的
详细参考案例:RentalCar项目 (注:这是个人参考项目,网友可以自己按照这四步去做个实例)
资料来源:暂时忘记了,下次看到补上,呵呵