eval_r( " ")和Bind( " ") 这两种一个单向绑定,一个双向绑定
bind是双向绑定,但需数据源可更改才能用
ASP.NET2.0改善了模板中的数据绑定操作,把v1.x中的数据绑定语法DataBinder.eval_r(Container.DataItem,fieldname)简化为eval_r(fieldname)。Eval方法与DataBinder.Eval一样可以接受一个可选的格式化字符串参数。缩短的Eval语法与DataBinder.Eval的不同点在于,Eval会根据最近的容器对象(例如DataListItem)的DataItem属性来自动地解析字段,而DataBinder.Eval需要使用参数来指定容器。由于这个原因,Eval只能在数据绑定控件的模板中使用,而不能用于Page(页面)层。当然,ASP.NET2.0页面中仍然支持DataBinder.Eval,你可以在不支持简化的Eval语法的环境中使用它。
下面的例子演示了如何使用新的简化的Eval数据绑定语法绑定到DataList数据项模板(ItemTemplate)中的Image、Label和HyperLink控件。
<asp:DataList ID= "DataList1 " RepeatColumns= "5 " Width= "600 "runat= "server " DataSourceID= "ObjectDataSource1 ">
<ItemTemplate>
<asp:HyperLink ID= "HyperLink1 " runat= "server " NavigateUrl='<%# eval_r( "PhotoID ","PhotoFormViewPlain.aspx?ID={0} ") %> '>
<asp:Image ID= "Image1 " Runat= "server " ImageUrl='<%# eval_r( "FileName ", "images/thumbs/{0} ")%> ' /></asp:HyperLink>
<asp:Label ID= "CaptionLabel " runat= "server " Text='<%# eval_r( "Caption ") %>' />
</ItemTemplate>
</asp:DataList><br />
<asp:ObjectDataSource ID= "ObjectDataSource1 " runat= "server "TypeName= "DataComponentTableAdapters.PhotosTableAdapter "SelectMethod= "GetPhotosForAlbum ">
数据绑定也可以作为控件的主题定义(themedefinition)的一部分,这样我们就可以通过改变主题来随意地改变模板化控件的布局和外观。但是Theme(主题)模板中只能使用Eval(或者后面讨论的Bind)。绑定到任意的用户代码是被禁止的。
【转】据绑定之 DataBinder.eval_r(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_r(Container.DataItem,"字段名","格式")%>
绑定到DataReader:
<%#((IDataReader)Container.DataItem).字段名%></FONT>
=======================
绑定到简单属性:<%#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_r(Container.DataItem,"字段名","格式")%>
绑定到DataReader:
<%#((IDataReader)Container.DataItem).字段名%>viewplaincopy to clipboardprint?
<FONTsize=3><P><FONTsize=3>一、DataBinder.Eval的基本格式灵活的运用数据绑定操作</FONT></P><P><FONTsize=3>在绑定数据时经常会用到这个句程序:<%#DataBinder.eval_r(Container.DataItem,"xxxx")%>或者<%#DataBinder.eval_r(Container,"DataItem.xxxx")%>
今天又学到一种,而且微软也说这种方法的效率要比以上两种高。</FONT></P><P><FONTsize=3><%#((DataRowView)Container.DataItem)["xxxx"]%></FONT></P><P><FONTsize=3>很有用的,这样可以在前台页面做好多事情了。</FONT></P><P><FONTsize=3>还要记住要这样用必须要在前台页面导入名称空间System.Data,否则会生成错误信息。</FONT></P><P><FONTsize=3><%@ Importnamespace="System.Data" %></FONT></P><P><FONTsize=3>这种用法其实和<%#((DictionaryEntry)Container.DataItem).Key%>是一个道理。</FONT></P><P><FONTsize=3>绑定到DataSet、DataTable时:</FONT></P><P><FONTsize=3><%#((System.Data.DataRowView)Container.DataItem)["字段名"]%>
<%#((System.Data.DataRowView)Container.DataItem)[索引]%></FONT></P><P>
<FONTsize=3>绑定到DataReader时:
<%#((System.Data.Common.DbDataRecord)Container.DataItem)[索引]%>
<%#((System.Data.Common.DbDataRecord)Container.DataItem)["字段名"]%></FONT></P><P><FONTsize=3>关键是Container这个东西,它比较神秘。它的名称空间是System.ComponentModel。对于它我还需要进一步理解。</FONT></P><P><FONTsize=3>初学.NET,现在在看DataGrid控件,在ItemTemplate显示数据时,
DataBinder.eval_r(Container.DataItem,"Name")和Container.DataItem("Name")有什么区别?</FONT></P><P>
<FONTsize=3>DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,</FONT></P><P><FONTsize=3>但是它使用的方式是通过Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。</FONT></P><P><FONTsize=3>而Container则根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,</FONT></P><P><FONTsize=3>其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),</FONT></P><P><FONTsize=3>在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。</FONT></P><P><FONTsize=3>如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView。</FONT></P></FONT>