asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET 2.0高级数据处理之数据绑定


发布日期:2018年12月10日
 
ASP.NET 2.0高级数据处理之数据绑定
在前面的模板中的数据绑定部分中我们论述过ASPNET包含了一种宣告式的数据绑定语法用于在数据绑定模板中把数据源字段与控件的属性相关联你也可以在代码中使用<%# >语法来进行任意值的数据绑定例如页面和控件属性集合表达式甚至于方法调用的返回结果为了强制计算数据绑定的值你必须在包含数据绑定语法的页面或控件上调用DataBind方法下面的表格显示了ASPNET中的数据绑定语法的一些例子

单个属性Customer: <%# custID %>集合 Orders<asp:ListBox id=List datasource=<%# myArray %> runat=server>表达式 Contact<%# ( customerFirstName + + customerLastName ) %>方法的返回值Outstanding Balance: <%# GetBalance(custID) %>

尽管上面的语法与ASP的ResponseWrite便捷语法(<%= %>)看起来类似但是它们的行为却决然不同ASP ResponseWrite便捷语法在页面处理的时候计算值而ASPNET数据绑定语法只在DataBind方法被调用的时候才计算值

DataBind是页面和所有务器控件的一个方法当你调用父控件的DataBind的时候它会依次调用所有子控件的DataBind方法例如DataListDataBind()就会调用DataList模板中的所有控件的DataBind方法调用页面的DataBind方法PageDataBind() 或简单地调用 DataBind()会引发页面上所有的数据绑定表达式的计算操作通常只在页面的Page_Load事件中调用DataBind方法如下面的例子所示

aspx页面的任何宣告式片断中你都可以使用绑定语法并为它的估值指定运行时所期望的数据类型上面例子中的简单属性表达式和方法在被计算的时候会向用户显示文本内容在这种情况下数据绑定表达式的值是String类型的在上面的集合例子中数据绑定语法的值的类型是ListBox的DataSource属性你会发现在绑定表达式中强制转换值的类型对于生成期望的结果是必要的例如如果count是一个整数

Number of Records: <%# countToString() %>

ASPNET数据绑定语法支持公共变量页面的属性和页面中其它控件的属性的绑定下面的例子演示了如何绑定到公共变量和页面的简单属性请注意在DataBind()被调用之前这些值都已经初始化过了

<script language=VB runat=server

Sub Page_Load(sender As Object e As EventArgs)

PageDataBind

End Sub

ReadOnly Property custID() As String

Get

Return ALFKI

End Get

End Property

ReadOnly Property orderCount() As Integer

Get

Return

End Get

End Property

</script>

<form action=DataBind_vbaspx runat=server

Customer: <b><%# custID %></b><br />

Open Orders: <b><%# orderCount %></b>

</form>

下面的例子演示如何绑定到另一个控件的属性

<asp:DropDownList id=StateList runat=server

<asp:ListItem>CA</asp:ListItem>

……

</asp:DropDownList>

<asp:button ID=Button Text=Submit OnClick=SubmitBtn_Click runat=server/>

Selected State: <asp:label ID=Label text=<%# StateListSelectedItemText %> runat=server/>列表类型的服务器控件(例如DropDownListListBox和HTMLSelect)把集合作为数据源下面的例子演示如何绑定到通用语言运行时集合类型这些控件只能绑定到支持IenumerableIcollection或IlistSource接口的集合更为常见的是它可以绑定到ArrayListHashtableDataView和DataReader下面的例子演示了如何绑定到ArrayList

Sub Page_Load(sender As Object e As EventArgs)

If Not IsPostBack Then

Dim values as ArrayList= new ArrayList()

valuesAdd (IN)

valuesAdd (KS)

valuesAdd (MD)

valuesAdd (MI)

valuesAdd (OR)

valuesAdd (TN)

DropDownDataSource = values

DropDownDataBind

End If

End Sub

下面的例子演示了如何绑定到DataView请注意DataView类是在SystemData名字空间中定义的


Sub Page_Load(sender As Object e As EventArgs)

If Not IsPostBack Then

Dim dt As DataTable

Dim dr As DataRow

Dim i As Integer

建立DataTable

dt = New DataTable

dtColumnsAdd(New DataColumn(IntegerValue GetType(Integer)))

dtColumnsAdd(New DataColumn(StringValue GetType(String)))

dtColumnsAdd(New DataColumn(DateTimeValue GetType(DateTime)))

dtColumnsAdd(New DataColumn(BooleanValue GetType(Boolean)))

填充一些数据

For i = To

dr = dtNewRow()

dr() = i

dr() = Item + iToString()

dr() = DateTimeNowToShortTimeString

If (i Mod <> ) Then

dr() = True

Else

dr() = False

End If

把数据行添加到表

dtRowsAdd(dr)

Next

GridViewDataSource = New DataView(dt)

GridViewDataBind()

End If

End Sub

下面的例子演示了如何绑定到Hashtable

Sub Page_Load(sender As Object e As EventArgs)

If Not IsPostBack Then

Dim h As Hashtable = new Hashtable()

hAdd (key value)

hAdd (key value)

hAdd (key value)

MyDataListDataSource = h

MyDataListDataBind

End If

End Sub

通常情况下你可能希望绑定到页面或控件之前先处理数据下面的例子演示了如何绑定到表达式和方法的返回值

Sub Page_Load(sender As Object e As EventArgs)

If Not IsPostBack Then

Dim values as ArrayList= new ArrayList()

valuesAdd ()

valuesAdd ()

valuesAdd ()

valuesAdd ()

valuesAdd ()

valuesAdd ()

valuesAdd ()

DataListDataSource = values

DataListDataBind

End If

End Sub

Function EvenOrOdd(number As Integer) As String

If (number Mod <> ) Then

Return Odd

Else

Return Even

End If

End Function

<asp:DataList id=DataList ……>

<ItemTemplate>

Number Value: <%# ContainerDataItem %>

Even/Odd: <%# EvenOrOdd(ContainerDataItem) %>

</ItemTemplate>

</asp:DataList>

ASPNET页面框架组件提供了一个静态的方法它估算延迟绑定(latebound)的数据绑定表达式并可以选择把其结果格式化为字符串在这种情况下DataBinderEval很方便因为它消除了开发者把估值转会为期望的数据类型所必须执行的很多显式转化工作当模板化列表中有数据绑定控件的时候它特别有用处因为在那种情况下通常数据行和数据字段都必须转换

看看下面的例子它需要把整数显示为货币字符串在标准的ASPNET数据绑定语法中你必须首先转换数据行的类型以检索数据字段IntegerValue接着把它作为参数传递给StringFormat方法


<%# StringFormat({:c} (CType(ContainerDataItem DataRowView)(IntegerValue))) %>

这个语法很复杂并且不容易记住与此形成对照的是DataBinderEval是一个简单的方法它只有三个参数数据项的命名容器(naming container)数据字段名称和格式化字符串在模板化的控件(例如FormView GridViewDetailsViewDataList或Repeater)中命名容器都是ContainerDataItem页面(Page)是另一种命名容器也可以用于DataBinderEval前面我们提到ASPNET 为DataBinderEval提供了一个新的简化的语法(Eval)你可以在数据绑定的控件模板中使用它来自动解析ContainerDataItem

<%# DataBinderEval(ContainerDataItem IntegerValue {:c}) %>

<%# Eval(IntegerValue {:c}) %>

格式化字符串参数是可选的如果省略了这个参数DataBinderEval会返回Object类型值如下所示

<%# CType(DataBinderEval(ContainerDataItem BoolValue) Boolean) %>

我们要重点注意的是与标准的数据绑定语法相比DataBinderEval会明显地影响性能这是因为它使用了延迟绑定的反射(reflection)请明智地使用DataBinderEval特别是在不需要格式化字符串的情况下

上一篇:ASP.NET中数据库数据导入Excel并打印

下一篇:如何在ASP.NET中使用JavaScript脚本