簡(jiǎn)介
Repeater、DataList和DataGrid控件構(gòu)成ASP+頁面框架中System.Web. UI.WebControls名稱空間內(nèi)的相關(guān)Web控件集。這些控件使HTML顯示所綁 定列表或數(shù)據(jù)源的內(nèi)容。因此,將它們統(tǒng)稱為“列表綁定控件”。
與框架中的其它 Web
控件類似,這些控件提供一致的編程模型并封裝一個(gè)獨(dú)立于瀏覽器的 表示邏輯。這些特性使開發(fā)人員能夠針對(duì)對(duì)象模型編程而不用必須掌握與 HTML 相關(guān)的那些不一致的和復(fù)雜的技術(shù)知識(shí)。
這三種控件可以按多種布局(包括列表、分欄/報(bào)紙欄目和流布局 (HTML流))來表示與其相關(guān)的數(shù)據(jù)源內(nèi)容。此外,它們還允許您創(chuàng)建完 全不同的或完全定制的布局。除了封裝有表示邏輯外,還提供了用來處理 已發(fā)送數(shù)據(jù)、執(zhí)行狀態(tài)管理和引發(fā)事件的功能。最后,它們還對(duì)諸如選擇、 編輯、分頁和排序之類的標(biāo)準(zhǔn)操作提供不同級(jí)別的支持。這些控件可以簡(jiǎn) 化幾種常見的 Web 應(yīng)用程序方案,包括報(bào)表、購物車、產(chǎn)品列表、查詢 結(jié)果和導(dǎo)航菜單。
下面幾節(jié)將進(jìn)一步說明這些控件和如何在您的 Web 應(yīng)用程序中使用 它們,以及如何選用控件。
列表綁定控件是如何工作的?
本節(jié)是本文其余部分的背景材料。概述了這些列表綁定控件的工作方 式、它們的共同特性以及某些相關(guān)概念。
DataSource 屬性 每個(gè)控件都有一個(gè)DataSource屬性,其類型為System.Collections. ICollection。用最簡(jiǎn)單的話來說,數(shù)據(jù)源是同類對(duì)象的一個(gè)列表或集合。
此框架中有幾個(gè)對(duì)象提供了 ICollection 的實(shí)現(xiàn)。這個(gè)集合包括 System.Data.DataView(它通常用來訪問關(guān)系數(shù)據(jù)庫和 XML 數(shù)據(jù))、一 般ICollection實(shí)現(xiàn)(如ArrayList和Hashtable)以及數(shù)組。
與傳統(tǒng)的數(shù)據(jù)綁定控件(它們通常需要ADO記錄集)不同,除了實(shí)現(xiàn) ICollection接口之外,這些列表綁定控件未對(duì)其數(shù)據(jù)源強(qiáng)加任何其它要 求。根據(jù)設(shè)計(jì),通過大量增加可作為有效DataSource屬性值的類型和數(shù)據(jù) 結(jié)構(gòu),它們能夠?yàn)槟膽?yīng)用程序代碼實(shí)現(xiàn)最大程度的簡(jiǎn)單和靈活性。
項(xiàng)目集合
每個(gè)列表綁定控件都包含一個(gè)項(xiàng)目集合?丶ㄟ^列舉這些對(duì)象當(dāng)前 的數(shù)據(jù)源來置入其項(xiàng)目集合。在列舉中為每個(gè)對(duì)象創(chuàng)建單個(gè)項(xiàng)目并用于表 示該對(duì)象。這些項(xiàng)目同時(shí)成為列表綁定控件中包含的控件層次結(jié)構(gòu)的一部 分。
下表列出了與數(shù)據(jù)源的數(shù)據(jù)相關(guān)聯(lián)的項(xiàng)目類型。
項(xiàng)目 創(chuàng)建的默認(rèn)項(xiàng)目類型 AlternatingItem 為項(xiàng)目集合中具有奇數(shù)下標(biāo)的項(xiàng)目創(chuàng)建 SelectedItem 為選定的項(xiàng)目創(chuàng)建(不論該項(xiàng)目是否為備選項(xiàng)目) EditItem 為處于編輯模式下的項(xiàng)目創(chuàng)建(不管它是否被選中或是否為備選項(xiàng)目)
控件同時(shí)創(chuàng)建將在表示中用到的下列項(xiàng)目。但是,它們并不與數(shù)據(jù)源 的數(shù)據(jù)相關(guān)聯(lián)。
標(biāo)頭 用來表示標(biāo)頭信息 注腳 用來表示注腳信息 分隔符 用來表示圖 1 中所示的每個(gè)項(xiàng)目之間的內(nèi)容,并且僅適用于 Repeater 和 DataList 分頁符 用來表示與 DataGrid 控件相關(guān)聯(lián)的分頁 UI
項(xiàng)目的數(shù)據(jù)綁定和創(chuàng)建
列表綁定控件遵循在整個(gè) ASP+ 框架中實(shí)現(xiàn)的顯式數(shù)據(jù)綁定模型。這 意味著控件僅當(dāng)其 DataBind 方法被調(diào)用時(shí)才需要并列舉其數(shù)據(jù)源。
當(dāng)調(diào)用 DataBind
方法時(shí),列表控件將列舉其數(shù)據(jù)源、創(chuàng)建項(xiàng)目并通過從其數(shù)據(jù)源中提 取值來對(duì)其進(jìn)行初始化。如果啟用了狀態(tài)管理,則控件還將保存所需的全 部信息,以便在頁面的回傳處理期間重新創(chuàng)建其項(xiàng)目而無須重新設(shè)置數(shù)據(jù) 源。
顯式數(shù)據(jù)綁定模型使您的應(yīng)用程序代碼可以精確地確定在處理序列中 何時(shí)及何處需要數(shù)據(jù)源。這種功能使對(duì)數(shù)據(jù)庫服務(wù)器的訪問更少且更高效, 而這些訪問通常是 Web 應(yīng)用程序最耗費(fèi)資源的操作。
一般規(guī)則是每當(dāng)您需要重新創(chuàng)建項(xiàng)目時(shí)都必須調(diào)用DataBind。在大多 數(shù)情況下,您將在您的頁面首次被請(qǐng)求創(chuàng)建初始項(xiàng)目集合時(shí)調(diào)用DataBind。 在該頁面的后續(xù)執(zhí)行過程中,您將需要在引起項(xiàng)目集合被更改的各種事件 處理程序中調(diào)用此方法。當(dāng)用于創(chuàng)建初始數(shù)據(jù)源的查詢被修改時(shí),就可能 發(fā)生這種情況。當(dāng)項(xiàng)目的狀態(tài)改變(如從只讀模式變?yōu)榫庉嬆J剑⿻r(shí)也可 能發(fā)生這種情況。
樣式
通過在對(duì)象模型上使用樣式屬性,您可以定義全部DataList和DataGrid 控件及其所包含項(xiàng)目的格式和外觀。這些屬性允許定制字體、顏色、邊框 和其它外觀因素。控件本身的樣式屬性(如前景色、背景色、字體和邊框 樣式)將影響整個(gè)控件的表示。
此外,每個(gè)控件都包含與其所創(chuàng)建的項(xiàng)目類型相匹配的大量樣式屬性, 如as ItemStyle、AlternatingItemStyle和headerStyle。DataGrid提供 第三級(jí)的樣式屬性,這些屬性將影響特定列的所有單元格?丶邪 每一列都可以擁有其自己的 headerStyle、FooterStyle 和 ItemStyle。
模板
樣式控制格式顯示,而模板則定義每個(gè)項(xiàng)目的內(nèi)容和表示。您可以將 模板看作HTML代碼片斷,它定義了用來表示項(xiàng)目的控件層次結(jié)構(gòu)。
Repeater 和 DataList 控件由您指定的模板來驅(qū)動(dòng),提供各種可設(shè) 置的模板屬性,如ItemTemplate、AlternatingItemTemplate和header Template。與樣式類似,每個(gè)模板都對(duì)應(yīng)于一個(gè)特定類型的項(xiàng)目。
DataGrid 控件未模板化。但是,控件的 Column 集合中的 Template Columns使DataGrid中模板的使用成為可能。TemplateColumn中的每個(gè)單 元格都可以包含一個(gè)模板,這與 Repeater 或 DataList 控件中的項(xiàng)目極 為類似。這也使 DataGrid 中的定制表示成為可能。
模板中的數(shù)據(jù)綁定
模板定義項(xiàng)目中包含的控件層次結(jié)構(gòu)。通過使用數(shù)據(jù)綁定表達(dá)式,此 層次結(jié)構(gòu)中的控件屬性可綁定到與此項(xiàng)目相關(guān)聯(lián)的數(shù)據(jù)屬性上。
作為模板的邏輯父級(jí)的項(xiàng)目在數(shù)據(jù)綁定表達(dá)式中被稱為“容器”。每 個(gè)容器都有一個(gè)稱為DataItem的屬性,該屬性引用其相關(guān)聯(lián)的數(shù)據(jù)。結(jié)果 是,模板中的大多數(shù)典型數(shù)據(jù)綁定表達(dá)式都將控件屬性綁定到 Container. DataItem的某個(gè)屬性上。將在以下幾節(jié)介紹的示例中進(jìn)一步說明這種綁定。
Repeater 控件
如前面所述,Repeater控件是完全由模板驅(qū)動(dòng)的,允許創(chuàng)建完全可定 制的表示和布局。下圖說明了這一功能。
摘自 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文件顯示了一個(gè)用于生成帶項(xiàng)目符號(hào)列表的 repeater控件的 聲明。
此示例說明了用數(shù)據(jù)綁定語法(〈%#...%〉)設(shè)置數(shù)據(jù)源的聲明方法。 當(dāng)您調(diào)用 DataBind 方法時(shí),數(shù)據(jù)綁定中的表達(dá)式就會(huì)被執(zhí)行。在這種情 況下,repeater 的 DataSource 屬性被綁定到頁面的 SiteLinks 屬性上, 后者包含要顯示的 URL 引用。
Repeater是唯一允許在其模板中存在 HTML片段的控件,將 Repeater 控件和HTML片段合在一起會(huì)產(chǎn)生良好形式的HTML。在本示例中,帶項(xiàng)目符 號(hào)的列表分為三個(gè)部分:
由 headerTemplate 表示的列表開始標(biāo)記 (〈ul type="1"〉)。
由 FooterTemplate 表示的列表結(jié)束標(biāo)記 (〈/ul〉)。
列表的主體由通過為 SiteLinks 集合中出現(xiàn)的每個(gè)對(duì)象重復(fù) Item Template 而生成的列表項(xiàng) (〈li〉) 置入。
您也可以使用這些模板在標(biāo)頭中指定表的開始標(biāo)記(〈TABLE〉),在注 腳中指定表的結(jié)束標(biāo)記(〈/TABLE〉),在每個(gè)項(xiàng)目中指定單個(gè)表行(〈TR〉)。此替換選項(xiàng)將導(dǎo)致列表表示。
您必須指定 ItemTemplate。它是唯一必需的模板。當(dāng)未指定其它模 板時(shí),控件會(huì)自動(dòng)將此 ItemTemplate 用于其它模板。
在以下示例中,ItemTemplate 包含一個(gè) HyperLink Web 控件。此控 件的Text和NavigateUrl屬性被綁定到與每個(gè)重復(fù)項(xiàng)目相關(guān)聯(lián)的數(shù)據(jù)屬性 上。這又是使用數(shù)據(jù)綁定表達(dá)式(在創(chuàng)建項(xiàng)目后立即對(duì)該表達(dá)式求值)完 成的。
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) { // 首次請(qǐng)求該頁時(shí)即對(duì)其進(jìn)行數(shù)據(jù)綁定 (DataBind)。 // 這將在此頁的控件層次結(jié)構(gòu)中遞歸調(diào)用每個(gè)控件。 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 文件包含隨前一個(gè)列表中的 aspx 頁一起出現(xiàn)的代碼。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!