簡介
Repeater、DataList和DataGrid控件構成ASP+頁面框架中System.Web. UI.WebControls名稱空間內的相關Web控件集。這些控件使HTML顯示所綁 定列表或數據源的內容。因此,將它們統稱為“列表綁定控件”。
與框架中的其它 Web
控件類似,這些控件提供一致的編程模型并封裝一個獨立于瀏覽器的 表示邏輯。這些特性使開發人員能夠針對對象模型編程而不用必須掌握與 HTML 相關的那些不一致的和復雜的技術知識。
這三種控件可以按多種布局(包括列表、分欄/報紙欄目和流布局 (HTML流))來表示與其相關的數據源內容。此外,它們還允許您創建完 全不同的或完全定制的布局。除了封裝有表示邏輯外,還提供了用來處理 已發送數據、執行狀態管理和引發事件的功能。最后,它們還對諸如選擇、 編輯、分頁和排序之類的標準操作提供不同級別的支持。這些控件可以簡 化幾種常見的 Web 應用程序方案,包括報表、購物車、產品列表、查詢 結果和導航菜單。
下面幾節將進一步說明這些控件和如何在您的 Web 應用程序中使用 它們,以及如何選用控件。
列表綁定控件是如何工作的?
本節是本文其余部分的背景材料。概述了這些列表綁定控件的工作方 式、它們的共同特性以及某些相關概念。
DataSource 屬性 每個控件都有一個DataSource屬性,其類型為System.Collections. ICollection。用最簡單的話來說,數據源是同類對象的一個列表或集合。
此框架中有幾個對象提供了 ICollection 的實現。這個集合包括 System.Data.DataView(它通常用來訪問關系數據庫和 XML 數據)、一 般ICollection實現(如ArrayList和Hashtable)以及數組。
與傳統的數據綁定控件(它們通常需要ADO記錄集)不同,除了實現 ICollection接口之外,這些列表綁定控件未對其數據源強加任何其它要 求。根據設計,通過大量增加可作為有效DataSource屬性值的類型和數據 結構,它們能夠為您的應用程序代碼實現最大程度的簡單和靈活性。
項目集合
每個列表綁定控件都包含一個項目集合。控件通過列舉這些對象當前 的數據源來置入其項目集合。在列舉中為每個對象創建單個項目并用于表 示該對象。這些項目同時成為列表綁定控件中包含的控件層次結構的一部 分。
下表列出了與數據源的數據相關聯的項目類型。
項目 創建的默認項目類型 AlternatingItem 為項目集合中具有奇數下標的項目創建 SelectedItem 為選定的項目創建(不論該項目是否為備選項目) EditItem 為處于編輯模式下的項目創建(不管它是否被選中或是否為備選項目)
控件同時創建將在表示中用到的下列項目。但是,它們并不與數據源 的數據相關聯。
標頭 用來表示標頭信息 注腳 用來表示注腳信息 分隔符 用來表示圖 1 中所示的每個項目之間的內容,并且僅適用于 Repeater 和 DataList 分頁符 用來表示與 DataGrid 控件相關聯的分頁 UI
項目的數據綁定和創建
列表綁定控件遵循在整個 ASP+ 框架中實現的顯式數據綁定模型。這 意味著控件僅當其 DataBind 方法被調用時才需要并列舉其數據源。
當調用 DataBind
方法時,列表控件將列舉其數據源、創建項目并通過從其數據源中提 取值來對其進行初始化。如果啟用了狀態管理,則控件還將保存所需的全 部信息,以便在頁面的回傳處理期間重新創建其項目而無須重新設置數據 源。
顯式數據綁定模型使您的應用程序代碼可以精確地確定在處理序列中 何時及何處需要數據源。這種功能使對數據庫服務器的訪問更少且更高效, 而這些訪問通常是 Web 應用程序最耗費資源的操作。
一般規則是每當您需要重新創建項目時都必須調用DataBind。在大多 數情況下,您將在您的頁面首次被請求創建初始項目集合時調用DataBind。 在該頁面的后續執行過程中,您將需要在引起項目集合被更改的各種事件 處理程序中調用此方法。當用于創建初始數據源的查詢被修改時,就可能 發生這種情況。當項目的狀態改變(如從只讀模式變為編輯模式)時也可 能發生這種情況。
樣式
通過在對象模型上使用樣式屬性,您可以定義全部DataList和DataGrid 控件及其所包含項目的格式和外觀。這些屬性允許定制字體、顏色、邊框 和其它外觀因素。控件本身的樣式屬性(如前景色、背景色、字體和邊框 樣式)將影響整個控件的表示。
此外,每個控件都包含與其所創建的項目類型相匹配的大量樣式屬性, 如as ItemStyle、AlternatingItemStyle和headerStyle。DataGrid提供 第三級的樣式屬性,這些屬性將影響特定列的所有單元格。控件中包含的 每一列都可以擁有其自己的 headerStyle、FooterStyle 和 ItemStyle。
模板
樣式控制格式顯示,而模板則定義每個項目的內容和表示。您可以將 模板看作HTML代碼片斷,它定義了用來表示項目的控件層次結構。
Repeater 和 DataList 控件由您指定的模板來驅動,提供各種可設 置的模板屬性,如ItemTemplate、AlternatingItemTemplate和header Template。與樣式類似,每個模板都對應于一個特定類型的項目。
DataGrid 控件未模板化。但是,控件的 Column 集合中的 Template Columns使DataGrid中模板的使用成為可能。TemplateColumn中的每個單 元格都可以包含一個模板,這與 Repeater 或 DataList 控件中的項目極 為類似。這也使 DataGrid 中的定制表示成為可能。
模板中的數據綁定
模板定義項目中包含的控件層次結構。通過使用數據綁定表達式,此 層次結構中的控件屬性可綁定到與此項目相關聯的數據屬性上。
作為模板的邏輯父級的項目在數據綁定表達式中被稱為“容器”。每 個容器都有一個稱為DataItem的屬性,該屬性引用其相關聯的數據。結果 是,模板中的大多數典型數據綁定表達式都將控件屬性綁定到 Container. DataItem的某個屬性上。將在以下幾節介紹的示例中進一步說明這種綁定。
Repeater 控件
如前面所述,Repeater控件是完全由模板驅動的,允許創建完全可定 制的表示和布局。下圖說明了這一功能。
摘自 Repeater1.aspx:
〈%@ Page language="C#" src="Repeater1.cs" inherits="Samples. Repeater1Page"%〉 ...
〈asp:Repeater runat=server id="linksListRepeater" DataSource='〈%# SiteLinks %〉'〉 〈template name="headerTemplate"〉 〈ul type="1"〉 〈/template〉 〈template name="ItemTemplate"〉 〈li〉 〈asp:HyperLink runat=server Text='〈%# DataBinder.Eval(Container.DataItem, "SiteName") %〉' NavigateUrl='〈%# DataBinder.Eval(Container.DataItem, "SiteURL") %〉'〉 〈/asp:HyperLink〉 〈/li〉 〈/template〉 〈template name="FooterTemplate"〉 〈/ul〉 〈/template〉 〈/asp:Repeater〉
此.aspx文件顯示了一個用于生成帶項目符號列表的 repeater控件的 聲明。
此示例說明了用數據綁定語法(〈%#...%〉)設置數據源的聲明方法。 當您調用 DataBind 方法時,數據綁定中的表達式就會被執行。在這種情 況下,repeater 的 DataSource 屬性被綁定到頁面的 SiteLinks 屬性上, 后者包含要顯示的 URL 引用。
Repeater是唯一允許在其模板中存在 HTML片段的控件,將 Repeater 控件和HTML片段合在一起會產生良好形式的HTML。在本示例中,帶項目符 號的列表分為三個部分:
由 headerTemplate 表示的列表開始標記 (〈ul type="1"〉)。
由 FooterTemplate 表示的列表結束標記 (〈/ul〉)。
列表的主體由通過為 SiteLinks 集合中出現的每個對象重復 Item Template 而生成的列表項 (〈li〉) 置入。
您也可以使用這些模板在標頭中指定表的開始標記(〈TABLE〉),在注 腳中指定表的結束標記(〈/TABLE〉),在每個項目中指定單個表行(〈TR〉)。此替換選項將導致列表表示。
您必須指定 ItemTemplate。它是唯一必需的模板。當未指定其它模 板時,控件會自動將此 ItemTemplate 用于其它模板。
在以下示例中,ItemTemplate 包含一個 HyperLink Web 控件。此控 件的Text和NavigateUrl屬性被綁定到與每個重復項目相關聯的數據屬性 上。這又是使用數據綁定表達式(在創建項目后立即對該表達式求值)完 成的。
Repeater1.cs:
namespace Samples { ...
public class Repeater1Page : Page { protected Repeater linksListRepeater;
public ICollection SiteLinks { get { ArrayList sites = new ArrayList();
sites.Add(new SiteInfo("Microsoft Home", "http://www.microsoft.com")); sites.Add(new SiteInfo("MSDN Home", "http://msdn.microsoft.com")); sites.Add(new SiteInfo("MSN Homepage", "http://www.msn.com")); sites.Add(new SiteInfo("Hotmail", "http://www.hotmail.com")); return sites; } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e);
if (!IsPostBack) { // 首次請求該頁時即對其進行數據綁定 (DataBind)。 // 這將在此頁的控件層次結構中遞歸調用每個控件。 DataBind(); } } }
public sealed class SiteInfo { private string siteName; private string siteURL;
public SiteInfo(string siteName, string siteURL) { this.siteName = siteName; this.siteURL = siteURL; }
public string SiteName { get { return siteName; } } public string SiteURL { get { return siteURL; } } } }
此 .cs 文件包含隨前一個列表中的 aspx 頁一起出現的代碼。
|