数据绑定Eval与Bind区别

使用数据绑定语法,可以将控件属性值绑定到数据,并指定值以对数据进行检索、更新、删除和插入操作。

数据绑定语法

         数据绑定表达式包含在 <%# 和 %> 分隔符之内,并使用 Eval 和 Bind 函数。Eval 函数用于定义单向(只读)绑定。Bind 函数用于定义双向(可更新)绑定。除了通过在数据绑定表达式中调用 Eval 和 Bind 方法执行数据绑定外,还可以调用 <%# 和 %> 分隔符之内的任何公共范围代码,以在页面处理过程中执行该代码并返回一个值。

         调用控件或 Page 类的 DataBind 方法时,会对数据绑定表达式进行解析。对于有些控件,如 GridViewDetailsView和 FormView 控件,会在控件的 PreRender 事件期间自动解析数据绑定表达式,不需要显式调用 DataBind 方法。

         Eval与Bind是两个方法,都可以实现前台数据绑定。
         Bind方法(双向数据绑定)即能把数据绑定到控件,又能把数据变更提交到数据库。
         Eval方法(单向数据绑定)它实现了数据读取的自动化,并能对绑定字段进行格式化显示,但是没有实现数据写入自动化。

         比如,当有GridView、DetailsView控件的时候,Bind方法可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。所以在数据绑定控件的EditItemTemplate或InsertItemTemplate中要使用Bind函数。

         其次,在进行数据绑定的时候,可以用DataBinder.Eval或者直接用Container.DataItem

DataBinder.Eval(Container.DataItem, "字段")
DataBinder.Eval(Container, "DataItem.字段")

/********************************************/

((对象类型)Container.DataItem).属性
如果是GridView,Repeat,DataList等
就是((DataRowView)Container.DataItem).Row["字段名"]
如果是SqlDataReader
就是((DbDataRecord)Container.DataItem)["字段名"]

 

灵活的运用数据绑定操作
 绑定到简单属性:<%#UserName%>

绑定到集合:<asp:ListBox id="ListBox1" datasource='<%# myArray%>' runat="server">
绑定到表达式:<%#(class1.property1.ToString() + "," + class1.property2.ToString())%>


绑定到方法返回值 :<%# GetSafestring(str) %>
绑定到
Hashtable:<%# ((DictionaryEntry)Container.DataItem).Key%>
绑定到ArrayList:<%#Container.DataItem %>

 

 

 

        若数组里里放的是对象则可能要进行必要的转换后再绑定如:
        <%#((
对象类型)Container.DataItem).属性%>

 

        绑定到DataView,DataTable,DataSet:
<%#((DataRowView)Container.DataItem)["字段名"]%>

 


 

 

<%#((DataRowView)Container.DataItem).Rows[0]["字段名"]%>


       

要格式化则 :
<%#string.Format("
格式",((DataRowView)Container.DataItem)["字段名"])%>

<%#DataBinder.Eval(Container.DataItem,"字段名","格式")%>

 

 

        绑定到DataReader:<%#((IDataReader)Container.DataItem).字段名%>

        当然为了方便一般使用最多的就是DataBinder类的Eval方法了.不过这样对于同时要绑定大量的数据效率要低一些

 

在绑定数据时经常会用到这个句程序:

<%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%#DataBinder.Eval(Container,"DataItem.xxxx")%>
<%# ((DataRowView)Container.DataItem)["xxxx"]%>

         绑定到DataSetDataTable:

         <%#((System.Data.DataRowView)Container.DataItem)["字段名"]%>
        <%#((System.Data.DataRowView)Container.DataItem)[
索引]%>
         
绑定到DataReader:

         <%#((System.Data.Common.DbDataRecord)Container.DataItem)[索引]%>

         <%#((System.Data.Common.DbDataRecord)Container.DataItem)["字段名"]%>

         Container的名称空间是System.ComponentModel

 

 

下面就来看看这两种数据绑定的区别:
         Eval是通过反射的方式来获取值,而Container则是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,里面存有值。

这样看来,用Container效率应该比较高,但是有一网友做了一组这样的测试
1.<@% DataBinder.Eval(Container.DataItem, "ColumnName") %> 
2.<@% DataBinder.Eval(Container.DataItem, "ColumnName", null) %> 
3.<@% DataBinder.Eval(Container, "DataItem.ColumnName", null) %> 
4.<@% ((DataRowView)Container.DataItem)["ColumnName"] %> 
5.<@% ((DataRowView)Container.DataItem).Row["ColumnName"] %>

来看哪个效率高,得出的结论是前三种由于用了反射,所以效率不高,但是第四种在某些情况下效率更低,第五种是一种比较合适的写法。

使用 Eval 方法

      Eval()方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法 
         Eval 方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind 方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。 
使用 Eval 方法 
         Eval 方法可计算数据绑定控件(如 GridView、DetailsView 和 FormView 控件)的模板中的后期绑定数据表达式。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 GridView 控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 Eval 方法。 
         Eval 方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为 String 类的 Format 方法定义的语法。    

         Eval方法(单向数据绑定)它实现了数据读取的自动化,但是没有实现数据写入自动化。
只要可以使用Eval的地方,就可以使用新的Bind方法。

 

通常使用的方法: 
<%# DataBinder.Eval(Container.DataItem, "ColumnName") %> 
<%# DataBinder.Eval(Container.DataItem, "ColumnName", null) %> 
<%# DataBinder.Eval(Container, "DataItem.ColumnName", null) %> 
其他用法: 
<%# ((DataRowView)Container.DataItem)["ColumnName"] %> 
<%# ((DataRowView)Container.DataItem).Row["ColumnName"] %> 
<%# ((DataRowView)Container.DataItem)["adtitle"] %> 
<%# ((DataRowView)Container.DataItem)[n] %> 
<%# ((DbDataRecord)Container.DataItem)[0] %> 
<%# (((自定义类型)Container.DataItem)).属性.ToString() %>//如果属性为字符串类型就不用ToString()了


DataBinder.Eval用法范例: 
       例如,在下面的代码片段中,一个整数显示为货币字符串。使用标准的 ASP.NET 数据绑定语法,必须首先强制转换数据行的类型以便检索数据字段 IntegerValue。然后,这将作为参数传递到 String.Format 方法: 

         <%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %> 

         将此语法与 DataBinder.Eval 的语法进行比较,后者只有三个参数:数据项的命名容器、数据字段名称和格式字符串。在模板化列表中(如 DataList 类、DataGrid 类或 Repeater 类),命名容器始终是 Container.DataItem。 

         <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
         格式字符串参数是可选的。如果它被忽略,DataBinder.Eval 将返回类型对象的值,如下面的示例所示:

         <%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %> 

         当对模板化列表中的控件进行数据绑定时,DataBinder.Eval 特别有用,因为数据行和数据字段通常都必须强制转换。

 

<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %> 
格式化字符串参数是可选的。如果忽略参数,DataBinder.Eval 返回对象类型的值, 
//显示二位小数 
<%# DataBinder.Eval(Container.DataItem, "UnitPrice", "${0:F2}") %> 
//{0:G}代表显示True或False 
<ItemTemplate> 
<asp:Image Width="12" Height="12" Border="0" runat="server" 
AlternateText='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "{0:G}") %>' 
ImageUrl='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "~/images/{0:G}.gif") %>' /> 
</ItemTemplate> 
//转换类型 
((string)DataBinder.Eval(Container, "DataItem.P_SHIP_TIME_SBM8")).Substring(4,4) 
{0:d} 日期只显示年月日 
{0:yyyy-mm-dd} 按格式显示年月日 
{0:c} 货币样式 
<%#Container.DataItem("price","{0:¥#,##0.00}")%> 
<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%> 
Specifier Type     Format   Output (Passed Double 1.42)  Output (Passed Int -12400) 
c  Currency        {0:c}     $1.42     -$12,400 
d  Decimal         {0:d}    System.FormatException  -12400 
e  Scientific      {0:e}    1.420000e+000    -1.240000e+004 
f  Fixed point     {0:f}  1.42    -12400.00 
g  General         {0:g}  1.42     -12400 
n  Number with commas for thousands  {0:n}  1.42     -12,400 
r  Round trippable    {0:r}  1.42     System.FormatException 
x  Hexadecimal    {0:x4}  System.FormatException   cf90 
{0:d} 日期只显示年月日 
{0:yyyy-mm-dd} 按格式显示年月日 
样式取决于 Web.config 中的设置,如: 
①{0:c}  或 {0:£0,000.00} 货币样式  标准英国货币样式 
<system.web> 
      <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" /> 
</system.web> 
显示为 £3,000.10 
②{0:c}  或 string.Format("{0:C}", price); 中国货币样式 
<system.web> 
      <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-cn" uiCulture="zh-cn" /> 
</system.web> 
显示为 ¥3,000.10

③{0:c}  或 string.Format("{0:C}", price); 美国货币样式 
<system.web> 
      <globalization requestEncoding="utf-8" responseEncoding="utf-8" /> 
</system.web> 
显示为 $3,000.10 

DataBinder.Eval(Container.DataItem,"Name")和Container.DataItem("Name")有什么区别?

       DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,但是它使用的方式是通过Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。而Container则根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView。

使用 Bind 方法

       Bind方法(双向数据绑定)即能把数据绑定到控件,又能把数据变更提交到数据库。

Bind 方法与 Eval 方法有一些相似之处,但也存在很大的差异。虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用 Bind 方法。

         在 ASP.NET 中,数据绑定控件(如 GridView、DetailsView 和 FormView 控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了 SQL Select、Insert、Delete 和 Update 语句,则通过使用GridView、DetailsView 或 FormView 控件模板中的 Bind 方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的 EditItemTemplate 或InsertItemTemplate 中要使用 Bind 函数。

         Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值