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

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

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值