`
圣诞王子
  • 浏览: 82898 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

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

 

 

分享到:
评论
1 楼 kuangkro 2012-07-01  
赞一个,正是我想要的

相关推荐

    C#如何利用反射将枚举绑定到下拉框详解

    主要给大家介绍了关于C#如何利用反射将枚举绑定到下拉框的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧

    Thinking in Java 中文第四版+习题答案

    13.10 下拉列表 13.11 列表框 13.12 布局的控制 13.13 action的替用品 13.14 程序片的局限 13.14.1 程序片的优点 13.15 视窗化应用 13.15.1 菜单 13.15.2 对话框 13.16 新型 13.16.1 新的事件模型 13.16.2 事件和...

    Think in Java(中文版)chm格式

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 ...

    JAVA_Thinking in Java

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    Java初学者入门教学

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    ThinkInJava

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    java 编程入门思考

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    thinkinjava

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    Thinking in Java简体中文(全)

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    java联想(中文)

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

Global site tag (gtag.js) - Google Analytics