首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

使用枚举和反射绑定上拉列表显示

2012-09-09 
使用枚举和反射绑定下拉列表显示在我们进行的项目开发中,经常会遇到类似“状态(status)”这样的“常量”吧。比

使用枚举和反射绑定下拉列表显示

在我们进行的项目开发中,经常会遇到类似“状态(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项目 (注:这是个人参考项目,网友可以自己按照这四步去做个实例)

?

资料来源:暂时忘记了,下次看到补上,呵呵

?

?

热点排行