C# 利用反射将枚举绑定到下拉框
前言:反射(Reflection)是.NET提供给开发者的一个强大工具,尽管作为.NET框架的使用者,很多时候不会用到反射。但在一些情况下,尤其是在开发一些基础框架或公共类库时,使用反射会使系统架构更加灵活。
在开发中,我们常常会遇到比如有些状态值在定义好后几乎从不改动,这时候使用数据库就显得有些多余了。首先想到的一个办法可能是在程序中创建一个数组来表示,此时,我们遇到了使用数组可能带来的第一个问题:不方便使用。当数组结构变更时,可能意味着所有使用过此数组的地方的索引都发生了变更,这是我们不想看到的。
这时,我们可以采用枚举:
public enum BookingStatus
{
未提交 =,
已提交,
已取消,
已定妥 =
}
在实际使用中,可能需要用户下拉选择这些状态值,这时就需要我们把枚举绑定到下拉框上(此处以Combobox为例)了。大家知道,可以绑定到下拉框列表的有两种类型:一种是实现了IEnumerable接口的可枚举类型,比如ArrayList,String[],List<T>;一类是实现了IListSource的数据源,比如DataTable,DataSet。
可是,枚举enum是一个基本类型,它不会实现任何的接口,显然,无法直接将枚举绑定到下拉框上,那么应该采用什么办法呢?
使用反射遍历枚举字段
要遍历枚举,首先就需要一个包含枚举每个字段信息的对象,这个对象至少应该包含两个属性,一个是字段的名称,一个是字段的值,以方便后续绑定。
先看下完整的代码:
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = GetDataTable();
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Value";
} public static DataTable GetDataTable()
{
Type t = typeof(BookingStatus); //创建类型
FieldInfo[] fieldinfo = t.GetFields(); //获取字段信息对象集合 DataTable table = new DataTable();
table.Columns.Add("Name", typeof(String));
table.Columns.Add("Value", typeof(Int32)); foreach (FieldInfo field in fieldinfo)
{
if (!field.IsSpecialName)
{
DataRow row = table.NewRow();
row[] = field.Name; //获取文本字段
row[] = (int)field.GetRawConstantValue(); //获取int数值
table.Rows.Add(row);
}
}
return table;
}
} public enum BookingStatus
{
未提交 =,
已提交,
已取消,
已定妥 =
}
效果:
这里大致做一个说明:Type抽象类提供了访问类型元数据的能力,当实例化了一个Type对象后,可以通过它的属性和方法,获取类型的元数据的信息,或者进一步获得该类型的成员的元数据信息。注意到这里,因为Type对象总是基于某一具体类型的,并且它是一个抽象类,所以再创建Type类型时,需要提供类型名称或者类型的实例。程序集元数据,通过Type类型就可以访问类型的元数据信息,而访问类型元数据的操作,就叫做反射。
使用泛型来达到代码重用
观察上面的代码,如果现在有另一个枚举,叫做TicketStatus,那么要将它的枚举项文本和值转换为DataTable,唯一需要改动的就是这里:
Type t = typeof(BookingStatus); //将枚举名称更换
既然这样,就可以利用泛型来实现代码的重用,将返回DataTable的方法更改为泛型方法:
public static DataTable GetDataTable<T>()
{
Type t = typeof(T); //创建类型
FieldInfo[] fieldinfo = t.GetFields(); //获取字段信息对象集合 //...............省略 return table;
}
从以上代码可以看出,综合使用反射,泛型等技术,可以极大地提高代码的灵活性,可重用性。
C# 利用反射将枚举绑定到下拉框的更多相关文章
- 枚举类返回Map键值对,绑定到下拉框
有时候,页面的下拉框要显示键值对,但是不想从数据库取,此时我们可以写一个枚举类, Java后台代码 1.枚举类 import java.util.HashMap; import java.util.M ...
- winform c#绑定combobox下拉框 年度代码。
winform c#绑定combobox下拉框 年度代码. comboBox1.Items.AddRange("});//邦定数据 comboBox1.Text = DateTime.Now ...
- knockoutjs foreach array绑定 表格 下拉框绑定
转载http://desert3.iteye.com/blog/1480471 knockoutjs foreach array绑定 表格 下拉框绑定 博客分类: Javascript 动态表格使 ...
- ThinkPHP中ajax绑定select下拉框无法显示
html代码: 控制器代码: 其中的<option value="{$vo.gradeId}">{$one.gradeName}</option> 在操作过 ...
- asp.net中如何绑定combox下拉框数据(调用存储过程)
#region 绑定类型(商品类型.仓库名称) public void DataType_Bind(int _peoid) { DataTable dt_goodsname = new DataTab ...
- GridView 中绑定DropDownList ,下拉框默认选中Label的值
在GridView中,我们 有时候要绑定值. 前台绑定的代码可以这样 <asp:TemplateField HeaderText="当前状态" ItemStyle-Horiz ...
- 绑定下拉框时避免触发SelectedIndexChanged事件
在从数据库读取数据集绑定到下拉框时会立即触发其SelectedIndexChanged事件造成异常,可对其SelectedIndexChanged事件采取先解除后附加的方法解决. cmbXl_gt.V ...
- Select下拉框使用ajax异步绑定数据
<!--前端样式--> <style> #searchs { width: 200px; position: absolute; border-top: none; margi ...
- 使用poi解决导出excel内下拉框枚举项较多的问题
废话少说,直接上代码: package com.fst.attachment.controller; import java.io.FileOutputStream; import org.apach ...
随机推荐
- WINDOWS CLUSTER -- 时间不同步导致的群集问题
故障描述,重启服务器后,发现该重启节点未成功加入到Windows群集中,导致该节点上的Alwayson服务也受影响处于“正在解析”状态,尝试重启cluster服务,发现无效,查看windows日志,发 ...
- WPF实战案例-数据代理
在我们wpf开发中,很多人会有mvvm模式去做wpf的项目. 是否有人遇到这样一个场景:在一个界面上,有个tabcontrol上面有4个页签,每个页签里面都有一个datagrid,里面显示的列基本一样 ...
- dbcp和druid(数据库连接池)
前言: 对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应 ...
- Lerning Entity Framework 6 ------ Defining the Database Structure
There are three ways to define the database structure by Entity Framework API. They are: Attributes ...
- AJPFX平台:中国的经济是个大泡沫吗?这个泡沫即将崩解吗?
AJPFX问:中国的经济是个大泡沫吗?这个泡沫即将崩解吗? 这一老问题,最近又一次引起世界的关注. 首先,中国在领导层变更之际,把2013年的增长目标定为7.5%,“保八”的调子不再,两位数高增长的时 ...
- win10+Theano+GPU
1. cuda + cudnn 首先还是要先安装GPU库,具体和caffe安装中一样. 2. Theano 为防止下载速度慢,配置清华镜像 conda config --add channels ht ...
- postgresql-递增uuid优点
递增uuid的优点: https://blog.2ndquadrant.com/on-the-impact-of-full-page-writes/ 减小wal生成
- salt-api return mysql返回的使用,记录操作日志
说在前面 折腾这个搞了半天,现做下记录 安装依赖(操作只在master端) yum install mysql-python or pip install mysql-python master端本地 ...
- c++中char类型字符串拼接以及int类型转换为char类型 && 创建文件夹
如下所示: #include <iostream> #include <windows.h> #include <cstring> using namespace ...
- NIO基础之同步、异步、阻塞、非阻塞
这里区分几个概念,也是常见但是容易混淆的概念,就是标题中的同步.异步.阻塞.非阻塞. 一.同步与异步 同步与异步,关心的是消息通信的机制.也就是调用者和被调用者之间,消息是如何进行通知的.如果是调用者 ...