反射的项目实战,将枚举转换成列表的办法
来源:互联网 发布:淘宝店装修 编辑:程序博客网 时间:2024/06/07 13:56
前篇我们讲了反射的一般应用,我们试着在实际项目中使用它
反射的妙用
考虑这样一个场景,在一个物料编辑界面,有一个物料类型字段需要输入,那么将给用户提供物料类型的下拉列表,这样一张表, 可以将表保存到后台数据库,也可以保存为一个枚举,自己喜欢。如下所示:
表ItemType 枚举 EmItemType
列1 TypeName 产品=0
列2 ID,其中ID列是唯一的 半成品=1
原料=2
END Enum
那么界面上的下拉框将绑定到这个列表,表和枚举使用如下
表的绑定(只做演示,所以代码粗糙,只想给大家提供思路)
Imports System.Data.SqlClient
Using cn As New _ SqlConnection("DataSource=192.168.18.233;InitialCatalog=AdventureWorks;Integrated Security=True")
cn.Open()
Using cmd As New SqlCommand("select * from Production.ProductCategory", cn)
Using adp As New SqlDataAdapter(cmd)
adp.Fill(mDS)
End Using
End Using
End Using
With Me.ComboBox1
.DropDownStyle = ComboBoxStyle.DropDownList
.DisplayMember = "Name"
.ValueMember = "ProductCategoryID"
.DataSource = mDS.Tables(0)
End With
枚举的绑定
1. 定义一个枚举EmItemType,见上文
2. 公开一个tblItemType的函数,定义如下
Public Function tblItemType () As InfoList
Dim emIT As EmItemType
Dim mType As Type = emIT.Gettype
Dim fis() As System.Reflection.FieldInfo = mT.GetFields(BindingFlags.Public Or _ BindingFlags.Static) ‘这里用到OR运算,待会我们介绍他的原理,fis()是枚举的所有项的信息
'生成数据列表
Dim list As InfoList = InfoList.NewInfoList ‘这里的infolist是我自定义的,下面有说明
Dim item As Info ‘这个是infolist里的项
For i As Integer = 0 To fis.Length - 1
item = list.AddNew ‘调用infolist的add方法返回一个info项
item.Value = fis(i).GetValue(emIT) ‘关键,取得枚举项的值
item.Name = My.Resources.ResourceManager.GetString(fis(i).Name)
item.Code = Format(i + 1, "00")
item.ID = dr.Value
Next
Return list
End Function
上面这个函数中,将枚举类通过反射来取得枚举内部的成员信息,不管是公开的还是私有的信息,取出了字段列表后将这些字段信息保存到一个自定义的列表(Item对象是InfoList列表的强类型对象)。其中特别值得注意的是,VALUE属性保存的是枚举的012三个值(看上面的枚举定义),而NAME属性保存的是枚举项的名字,包括产品,半成品,原料(这里使用了My.Resources.ResourceManager.GetString(fis(i).Name),这样就支持你的界面可以支持多种不同的语言,只要你在项目的资源列表那里添加了英文和日文的对照,则可以传递英文字符作为参数让显示出来的列表是日文,你添加了英文和中文的对照,则显示列表可以是中文,右键我的项目/资源/添加一项 名称为Project 值为 项目,则My.Resources.ResourceManager.GetString(Project)将返回项目文本) ,而Code属性保存的是该字段的编码信息,他的作用是提供列表的搜索功能(想象你的列表有很多项,假如客户输入其中一个匹配项就自动找到与此匹配的项),对于列表的搜索和多语言的开发迟点再专题来讲。
好了,看看InfoList和Info类的定义吧,之所以不把这些枚举信息保存到普通的表,是因为我们保存到集合可以支持更多丰富的功能。
Public Class InfoList ‘这是个泛型类,接下来我还会讲泛型的使用
Inherits system.compentmodel.bindinglist(of Info)
End class
Infolist类,其中包含了 增加,删除,查找项以及创建,筛选列表等方法,另外还有一些事件,支持当往列表增加或移除项时,以及列表项的属性更改时的事件等。
Public class Info
Info类包括四个变量以及这些变量公开的属性 mID,mValue,mName,mCode这几个变量的作用,ID是唯一标识一项的,VALUE是存储列表的值,NAME是存储列表项的名字,它支持多语言(语言信息是作为资源保存在项目里面的),CODE是存储项的编码信息,你可以写个自定义函数来生成编码,编码的作用是可以让你在界面那里提供用户输入时自动找出匹配的功能。
那么枚举的绑定代码
还记得Public Function tblItemType () As InfoList吗。
With Me.ComboBox1
.DropDownStyle = ComboBoxStyle.DropDownList
.DisplayMember = "Name"
.ValueMember = "ProductCategoryID"
.DataSource = tblItemType ‘这里调用该函数即可取得列表了。
End With
有个小提醒,假如你这个物料编辑界面保存好了,那么下次打开该界面的时候,列表应该自动显示保存后的项,只需要将控件的SelectedValue属性绑定到Info对象的VALUE属性即可
Dim bd as new binding (“SelectedValue”,me.combobox1,tblitemtype,”Value”) 参数1是控件属性,参数2是控件名,参数3是数据源,参数4是数据源列表项的VALUE属性,因为我们要保存的都是VALUE而不是显示在界面的NAME,所以绑定后,不管用户选择了哪一项,我们都能保存到该项的值。我们这里用到了简单绑定,对于像网格那样的绑定,以后将讲其原理。
有个疑问留给大家,不知道大家有没有用过按位运算,假如你要查询产品和半成品的记录或者是半成品和原料等组合查询,那么如何通过枚举来达到呢?
回头看看我刚才写的枚举转成列表的函数中出现了这么一句
Dim fis() As System.Reflection.FieldInfo = mT.GetFields(BindingFlags.Public Or _ BindingFlags.Static)
其中的BindingFlags.Public Or BindingFlags.Static 可以看到,有两个枚举进行了OR运算。大家都知道这代表或者的意思,那么如何从字段列表中过滤出Public或者Static呢,原理是什么呢?由于按位运算又是个主题,我将它放到下篇将做介绍。按位运算不可不懂,功能太好了。
3。按位运算的项目实践,接上文的反射项目实践
- 反射的项目实战,将枚举转换成列表的办法
- 将字符转换成整型的办法
- iOS开发实战:如何将非ARC的项目转换成ARC项目
- iOS开发实战:如何将非ARC的项目转换成ARC项目
- iOS开发实战:如何将非ARC的项目转换成ARC项目
- iOS开发实战:如何将非ARC的项目转换成ARC项目
- 将Dcom对象转换成Com+对象的一种办法
- 将xml转换成json最简单的办法
- 枚举 遍历枚举中所有的值、将某一个值转换成枚举型
- 枚举转换成列表,通过数值获取对应的枚举变量
- 实战怎么将pdf转换成txt的教程
- 将List对象列表转换成JSON格式的类
- 枚举、反射的学习
- 反射枚举的值
- ASP.NET.MVC--注解和反射将Enum转换List<SelectListItem>为@Html.DropDownListFor()下拉列表的通用方法
- 一种将list转换成hashmap的笨办法 其实是将json类型数据转换成键值对
- 将vs2010项目转换成vs2008项目的方法
- 将Maven项目转换成Eclipse支持的Java项目
- 关于引用了母版页后,怎么在内容页里写javascript的验证表单的代码?
- SOA
- 面向对象之关系依赖
- 超级简单好用的JS日期控件
- QCIF CIF 2CIF 4CIF DCIF
- 反射的项目实战,将枚举转换成列表的办法
- 曾经与牛人共事
- VS2005中WEB服务器配置不正确的几种常见解决方法
- 谁有论坛在线人数统计的code啊?
- UML说明类关系
- 使用 8 位 YUV 格式的视频呈现
- Java开发者的十大戒律
- Web.config详解
- VB.Net实现Ftp下载的方法