在我们进行的项目开发中,经常会遇到类似“状态(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项目 (注:这是个人参考项目,网友可以自己按照这四步去做个实例)
资料来源:暂时忘记了,下次看到补上,呵呵
本文详细介绍了如何使用枚举绑定下拉列表,包括定义枚举、自定义属性、绑定方法及实例应用,提供了从定义到实现的完整流程。
4677

被折叠的 条评论
为什么被折叠?



