绑定Enum到ASP.NET数据绑定控件的完美解决方案
2008-02-22 09:43:33来源:互联网 阅读 ()
本文向读者介绍NBear中实现的DropDownListField字段绑定控件和EnumDescriptionAttribute特性。结合使用这两个组件,就可以最简单、易用和可扩展地完美解决绑定Enum到ASP.NET数据绑定控件的问题。[05/26修订]——增加支持第三方枚举描述,支持二进制与过的枚举值。
从DropDownListField的名称,大家一定猜到了,是的,DropDownListField控件和ASP.NET内置的BoundField,CheckBoxField等一样,可以直接用于GridView,DetailsView等控件的声明中,用于描述一个Enum类型的字段的绑定。使用DropDownListField,我们就再也不需要向原来一样为了绑定一个Enum类型的值而使用自定义ItemTemplate并嵌入DropDownList,并写额外代码来填充ItemTemplate中的DropDownList了。
首先,我们看看如何在我们的页面代码中使用DropDownListField控件:
1<%@ Page Language="C#" %>
2<%@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" >
5<head runat="server">
6 <title>NBear DataSource Test</title>
7</head>
8<body>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="test access db"
11 TypeName="Entities.SimpleData" FilterExpression="{SimpleID} > 0" DefaultOrderByExpression="{SimpleID} DESC, {SimpleName}" />
12 <asp:GridView ID="TestGrid" runat="server" DataSourceID="TestDS" AllowSorting="True" AllowPaging="True"
13 PageSize="3" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" DataKeyNames="SimpleId" AutoGenerateColumns="False" >
14 <Columns>
15 <asp:BoundField DataField="SimpleId" HeaderText="SimpleId" SortExpression="SimpleId" />
16 <asp:BoundField DataField="SimpleName" HeaderText="SimpleName" SortExpression="SimpleName" />
17 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" SortExpression="BoolVal"
18 Text="BoolVal" />
19 <nb:DropDownListField DataField="Status" HeaderText="Status" SortExpression="Status" EnumType="EntityDesigns.SimpleStatus" />
20 </Columns>
21 </asp:GridView>
22 <br />
23 <asp:DetailsView ID="TestDetail" runat="server" DataSourceID="TestDS" DefaultMode="Insert"
24 AutoGenerateInsertButton="True" AutoGenerateRows="False">
25 <Fields><asp:BoundField DataField="SimpleName" HeaderText="Name" />
26 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" />
27 <nb:DropDownListField DataField="Status" HeaderText="Status" EnumType="EntityDesigns.SimpleStatus" />
28 </Fields>
29 </asp:DetailsView>
30</form>
31</body>
32</html>
请注意第2和第19,27行。在页面中,首先要注册NBear.Web.Data命名空间。接着,在数据控件的Columns中,添加DropDownListField就行了,和ASP.NET内置的的CheckBoxField使用中的唯一区别是,DropDownListField必须额外设置一个EnumType属性,顾名思义,就是绑定到这个控件Enum字段的类型的FullName。
OK,就是这么简单。本页面中使用到的SimpleStatus如下:
1 public enum SimpleStatus
2 {
3 Value1 = 1,
4 Value2 = 2
5 }
如果运行这个页面,您将可以看到DropDownList中显示的是Value1和Value2。
-
等1秒钟,你一定要说,这还不是我想要的,因为,我需要枚举值在DropDownList中显示的文字描述是我需要的自定义信息。
OK,接着就轮到本文的第二个主角——EnumDescriptionAttribute了。
只需要如下使用EnumDescriptionAttribute标注Value1和Value2就行:
1 public enum SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
4 Value1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
6 Value2 = 2
7 }
OK,不需要任何额外设置了,再运行上面的页面,您将能看到DropDownList中显示的文字是我们指定的自定义信息了。很酷不是吗?
-
再等一秒钟,我们还是不会满足的,虽然我们可以指定自定义说明信息,但是,如果是多语言环境,我们需要运行时对枚举值的显示不同的文字信息,还有很多情况,我们需要从数据库中的枚举描述表读取对枚举的描述信息。
对此,我们当然也提供了解决方案。
我们只需要继承EnumDescriptionAttribute即可。下面的MyEnumDescriptionAttribute演示了一个自定义的枚举描述实现:
1 public class MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] customDescs = new string[] { "custom desc of Value1", null }; //the second value is null here to use the DefaultDescription set in enum definition
4
5 public override string GetDescription(object enumValue)
6 {
7 return customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8 }
9 }
这个类重载了EnumDescriptionAttribute的GetDescription()方法,从一个内存中的数组中读取描述信息。类似的,我们也可以在这里从资源文件或者数据库中读取说明信息,都只需要重载这个方法就可以了。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash