同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁 優(yōu)化推廣 數(shù)據(jù)綁定以及Container.DataItem的具體分析(轉(zhuǎn))

數(shù)據(jù)綁定以及Container.DataItem的具體分析(轉(zhuǎn))

來源: | 時間:2011/4/7 16:07:18 |

Eval( " ")和Bind( " ") 這兩種一個單向綁定,一個雙向綁定
 

bind是雙向綁定,但需數(shù)據(jù)源可更改才能用

ASP.NET 2.0改善了模板中的數(shù)據(jù)綁定操作,把v1.x中的數(shù)據(jù)綁定語法DataBinder.Eval(Container.DataItem, fieldname)簡化為Eval(fieldname)。Eval方法與DataBinder.Eval一樣可以接受一個可選的格式化字符串參數(shù)。縮短的Eval語法與DataBinder.Eval的不同點在于,Eval會根據(jù)最近的容器對象(例如DataListItem)的DataItem屬性來自動地解析字段,而DataBinder.Eval需要使用參數(shù)來指定容器。由于這個原因,Eval只能在數(shù)據(jù)綁定控件的模板中使用,而不能用于Page(頁面)層。當(dāng)然,ASP.NET 2.0頁面中仍然支持DataBinder.Eval,你可以在不支持簡化的Eval語法的環(huán)境中使用它。

下面的例子演示了如何使用新的簡化的Eval數(shù)據(jù)綁定語法綁定到DataList數(shù)據(jù)項模板(ItemTemplate)中的Image、Label和HyperLink控件。



<asp:DataList ID= "DataList1 " RepeatColumns= "5 " Width= "600 " runat= "server " DataSourceID= "ObjectDataSource1 ">

?。糏temTemplate>

 ?。糰sp:HyperLink ID= "HyperLink1 " runat= "server " NavigateUrl= '<%# Eval( "PhotoID ", "PhotoFormViewPlain.aspx?ID={0} ") %> '>

 ?。糰sp:Image ID= "Image1 " Runat= "server " ImageUrl= '<%# Eval( "FileName ", "images/thumbs/{0} ") %> ' /></asp:HyperLink>

 ?。糰sp:Label ID= "CaptionLabel " runat= "server " Text= '<%# Eval( "Caption ") %> ' />

 </ItemTemplate>

</asp:DataList><br />

<asp:ObjectDataSource ID= "ObjectDataSource1 " runat= "server " TypeName= "DataComponentTableAdapters.PhotosTableAdapter " SelectMethod= "GetPhotosForAlbum ">

 

 

數(shù)據(jù)綁定以及Container.DataItem的具體分析
靈活的運用數(shù)據(jù)綁定操作
綁定到簡單屬性:<%#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 %>

若數(shù)組里里放的是對象則可能要進行必要的轉(zhuǎn)換后再綁定如:
<%#((對象類型)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).字段名%>

當(dāng)然為了方便一般使用最多的就是DataBinder類的Eval方法了.不過這樣對于同時要綁定大量的數(shù)據(jù)效率要低一些

在綁定數(shù)據(jù)時經(jīng)常會用到這個句程序:<%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%# DataBinder.Eval(Container,"DataItem.xxxx")%>
今天又學(xué)到一種,而且微軟也說這種方法的效率要比以上兩種高。

<%# ((DataRowView)Container.DataItem)["xxxx"]%>

很有用的,這樣可以在前臺頁面做好多事情了。

還要記住要這樣用必須要在前臺頁面導(dǎo)入名稱空間System.Data,否則會生成錯誤信息。

<%@ Import namespace="System.Data" %>

這種用法其實和<%# ((DictionaryEntry)Container.DataItem).Key%>是一個道理。

綁定到DataSet、DataTable時:

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


綁定到DataReader時:
<%#((System.Data.Common.DbDataRecord)Container.DataItem)[索引]%>
<%#((System.Data.Common.DbDataRecord)Container.DataItem)["字段名"]%>

關(guān)鍵是Container這個東西,它比較神秘。它的名稱空間是System.ComponentModel。對于它我還需要進一步理解。

初學(xué).NET,現(xiàn)在在看DataGrid控件,在ItemTemplate顯示數(shù)據(jù)時,
 

DataBinder.Eval(Container.DataItem,"Name")和Container.DataItem("Name")有什么區(qū)別?


DataBinder是System.Web里面的一個靜態(tài)類,它提供了Eval方法用于簡化數(shù)據(jù)綁定表達式的編寫,但是它使用的方式是通過 Reflection等開銷比較大的方法來達到易用性,因此其性能并不是最好的。而Container則根本不是任何一個靜態(tài)的對象或方法,它是 ASP.NET頁面編譯器在數(shù)據(jù)綁定事件處理程序內(nèi)部聲明的局部變量,其類型是可以進行數(shù)據(jù)綁定的控件的數(shù)據(jù)容器類型(如在Repeater內(nèi)部的數(shù)據(jù)綁定容器叫RepeaterItem),在這些容器類中基本都有DataItem屬性,因此你可以寫Container.DataItem,這個屬性返回的是你正在被綁定的數(shù)據(jù)源中的那個數(shù)據(jù)項。如果你的數(shù)據(jù)源是DataTable,則這個數(shù)據(jù)項的類型實際是DataRowView

 

Q:Eval()方法的源代碼?DataBinder.Eval()和Eval()各個用法的性能區(qū)別?


 

A:實際上Eval方法是TemplateControl的,而System.Web.UI.Page和System.Web.UI.UserControl都繼承于TemplateControl,所以我們可以在Page和UserControl上直接調(diào)用個方法。

Page.Eval方法可以幫助我們更好的撰寫數(shù)據(jù)綁定表達式,在ASP.NET 1.x時代,數(shù)據(jù)綁定表達式的一般形式是:

<%# DataBinder.Eval( Container , “DataItem.Name”) %>

而在ASP.NET 2.0中,同樣的代碼,我們可以這樣寫:

<%# Eval( “Name” )%>

ASP.NET 2.0是怎么實現(xiàn)的呢?我們先從Eval方法來研究,通過反射.NET Framework 2.0類庫的源代碼,我們可以看到這個方法是這樣實現(xiàn)的:

protected internal object Eval(string expression)

{

this.CheckPageExists();

return DataBinder.Eval(this.Page.GetDataItem(), expression);

}

第一行我們不必管,這是檢查調(diào)用的時候有沒有Page對象的,如果沒有則會拋出一個異常。

關(guān)鍵是第二行:

return DataBinder.Eval(this.Page.GetDataItem(), expression);

Page.GetDataItem()也是2.0中新增的一個方法,用途是正是取代ASP.NET 1.x中的Container.DataItem。

看來不摸清楚GetDataItem()方法,我們也很難明白Eval的原理。GetDataItem的實現(xiàn)也很簡單:

public object GetDataItem()

{

服務(wù)熱線

153 8323 9821

功能和特性

價格和優(yōu)惠

網(wǎng)站和維護

推廣和優(yōu)化

微信服務(wù)號