使用 ASP+ 列表繫結控制項 (轉自ms 一)
最後更新:2017-02-28
來源:互聯網
上載者:User
asp+|控制項 使用 ASP+ 列表繫結控制項
Nikhil Kothari
Microsoft Corporation
2000年7月
摘要: 說明 ASP+ Repeater、DataList 和 DataGrid 伺服器控制項。這些控制項能夠實現一個根植於資料來源的,基於 HTML 的應用程式使用者介面。討論與這些控制項有關的概念並概要介紹使用這些控制項的基本樣本。
目錄
簡介
列表繫結控制項是如何工作的?
重複器控制項
DataList 控制項
DataGrid 控制項
Repeater、DataList 或 DataGrid?
相關資源
下載與本文相關的樣本檔案 (56 KB)。
簡介
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
圖 1. 相對於“控制項”集合的“項目”集合
項目的資料繫結和建立
列表繫結控制項遵循在整個 ASP+ 架構中實現的顯式資料繫結模型。這意味著控制項僅當其 DataBind 方法被調用時才需要並列舉其資料來源。
當調用 DataBind 方法時,清單控制項將列舉其資料來源、建立項目並通過從其資料來源中提取值來對其進行初始化。如果啟用了狀態管理,則控制項還將儲存所需的全部資訊,以便在頁面的回傳處理期間重新建立其項目而無須重新設定資料來源。
顯式資料繫結模型使您的應用程式代碼可以精確地確定在處理序列中何時及何處需要資料來源。這種功能使對資料庫伺服器的訪問更少且更高效,而這些訪問通常是 Web 應用程式最耗費資源的操作。
一般規則是每當您需要重新建立項目時都必須調用 DataBind。在大多數情況下,您將在您的頁面首次被請求建立初始項目集合時調用 DataBind。在該頁面的後續執行過程中,您將需要在引起項目集合被更改的各種事件處理常式中調用此方法。當用於建立初始資料來源的查詢被修改時,就可能發生這種情況。當項目的狀態改變(如從唯讀模式變為編輯模式)時也可能發生這種情況。
樣式
通過在物件模型上使用樣式屬性,您可以定義全部 DataList 和 DataGrid 控制項及其所包含項目的格式和外觀。這些屬性允許定製字型、顏色、邊框和其它外觀因素。控制項本身的樣式屬性(如前景色彩、背景色、字型和邊框樣式)將影響整個控制項的表示。
此外,每個控制項都包含與其所建立的項目類型相匹配的大量樣式屬性,如 as ItemStyle、AlternatingItemStyle 和 headerStyle。DataGrid 提供第三級的樣式屬性,這些屬性將影響特定列的所有儲存格。控制項中包含的每一列都可以擁有其自己的 headerStyle、FooterStyle 和 ItemStyle。
模板
樣式控制格式顯示,而模板則定義每個項目的內容和表示。您可以將模板看作 HTML 程式碼片斷,它定義了用來表示項目的控制項階層。
Repeater 和 DataList 控制項由您指定的模板來驅動,提供各種可設定的模板屬性,如 ItemTemplate、AlternatingItemTemplate 和 headerTemplate。與樣式類似,每個模板都對應於一個特定類型的項目。
DataGrid 控制項未模板化。但是,控制項的 Column 集合中的 TemplateColumns 使 DataGrid 中模板的使用成為可能。TemplateColumn 中的每個儲存格都可以包含一個模板,這與 Repeater 或 DataList 控制項中的項目極為類似。這也使 DataGrid 中的定製表示成為可能。
模板中的資料繫結
模板定義項目中包含的控制項階層。通過使用資料繫結運算式,此階層中的控制項屬性可綁定到與此項目相關聯的資料屬性上。
作為模板的邏輯父級的項目在資料繫結運算式中被稱為“容器”。每個容器都有一個稱為 DataItem 的屬性,該屬性引用其相關聯的資料。結果是,模板中的大多數典型資料繫結運算式都將控制項屬性綁定到 Container.DataItem 的某個屬性上。將在以下幾節介紹的樣本中進一步說明這種綁定。
重複器控制項
如前面所述,重複器控制項是完全由模板驅動的,允許建立完全可定製的表示和布局。下圖說明了這一功能。
圖 2. 使用 重複器控制項產生的帶項目符號的連結清單
摘自 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 片段的控制項,將 重複器控制項和 HTML 片段合在一起會產生良好形式的 HTML。在本樣本中,帶項目符號的列表分為三個部分:
由 headerTemplate 表示的列表開始標記 (<ul type="1">)。
由 FooterTemplate 表示的列表結束標記 (</ul>)。
列表的主體由通過為 SiteLinks 集合中出現的每個對象重複 ItemTemplate 而產生的清單項目 (<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 頁一起出現的代碼。
Repeater1Page 類覆蓋了 Page 類的 OnLoad 方法。此表示在對該頁的首次請求中調用 DataBind。這將導致對這些頁上的資料繫結運算式求值並使 repeater 控制項列舉資料來源以及建立其項目。僅在首次請求時調用 DataBind 方法。這之所以能正常工作是因為 repeater 能夠在從前一次儲存狀態的回傳過程中重新建立其項目,而無需資料來源執行個體。
此頁將類型 ICollection 的公用屬性顯露出來。這將在設定 repeater 的 DataSource 屬性值的資料繫結運算式中使用。屬性的擷取實現使用包含一組 SiteInfo 對象序列的 ArrayList。此屬性是公用的,因為只有頁類的公用和保護成員可在資料繫結運算式中使用。
每個 SiteInfo 對象有兩個屬性:SiteName 和 SiteURL。當對模板中的 HyperLink 控制項進行資料繫結時將訪問這些屬性。在此控制項的綁定運算式中,Container.DataItem 表示要將特定項綁定到其上的單個 SiteInfo 對象。DataBinder.Eval(Container.DataItem, "SiteName") 訪問當前 SiteInfo 對象的 SiteName 屬性。
Repeater1 樣本向您介紹了幾個基本概念:
定義模板
模板中的資料繫結文法和資料繫結運算式
將 ArrayList 的 ICollection 表示用作資料來源
在最初處理頁的過程中調用 DataBind 方法
DataList 控制項
DataList 控制項是一個樣板化控制項,它提供使用樣式屬性可視化地格式化其表示的能力。它也可以產生多欄版面配置。圖 3 說明了這兩種特性。
圖 3. 從 DataList 的雙列表示產生的樣本
摘自 DataList1.aspx:
<%@ Page language="C#" src="DataList1.cs" inherits="Samples.DataList1Page"%>
...
<asp:DataList runat=server id="peopleDataList"
RepeatColumns="2" RepeatDirection="Vertical" RepeatMode="Table"
Width="100%">
<property name="AlternatingItemStyle">
<asp:TableItemStyle BackColor="#EEEEEE"/>
</property>
<template name="ItemTemplate">
<asp:Panel runat=server font-size="12pt" font-bold="true">
<%# ((Person)Container.DataItem).Name %>
</asp:Panel>
<asp:Label runat=server Width="20px"
BorderStyle="Solid" BorderWidth="1px" BorderColor="Black"
BackColor='<%# ((Person)Container.DataItem).FavoriteColor %>'>
</asp:Label>
<asp:Label runat=server Font-Size="10pt"
Text='<%# GetColorName(((Person)Container.DataItem).FavoriteColor) %>'>
</asp:Label>
</template>
</asp:DataList>
此 .aspx 檔案顯示了用來產生此樣本的 DataList 的聲明。
在此樣本中,DataList 的多欄版面配置是通過將 RepeatColumns 屬性設定為“2”來實現的。將 RepeatDirection 設定為“Vertical”會使項目從上到下、然後從左至右排列。相反,值設定為“Horizontal”會導致項目從左至右、然後從上到下排列。
aspx 文法包含對少數幾種 DataList 的樣式屬性的設定。在此樣本中,DataList 的 Width 被設定為其父級的 100%。設定具有灰色背景的 AlternatingItemStyle 是為了獲得帶有條紋的外觀。此樣本還說明模板可以包含任意複雜的控制項定義,以滿足在每個項目內獲得理想布局的需要。
最後,此模板中的資料繫結運算式通過將 Container.DataItem 轉換為其類型來使用前期綁定。這不會招致與使用 DataBinder.Eval (如 Repeater1 中所示) 相關聯的後期綁定的代價。但是,這種方法可能會產生可讀性較差的運算式。以下樣本還給出了一個調用 GetColorName 方法(該方法是在本頁有代碼支援的檔案中實現的)的運算式樣本。
DataList1.cs:
namespace Samples {
...
public class DataList1Page : Page {
protected DataList peopleDataList;
protected string GetColorName(Color c) {
return
TypeDescriptor.GetConverter(typeof(Color)).ConvertToString(c);
}
private void LoadPeopleList() {
// 建立資料來源
Person[] people = new Person[] {
new Person("Nikhil Kothari", Color.Green),
new Person("Steve Millet", Color.Purple),
new Person("Chris Anderson", Color.Blue),
new Person("Mike Pope", Color.Orange),
new Person("Anthony Moore", Color.Yellow),
new Person("Jon Jung", Color.MediumAquamarine),
new Person("Susan Warren", Color.SlateBlue),
new Person("Izzy Gryko", Color.Red)
};
// 設定控制項的資料來源
peopleDataList.DataSource = people;
// 並使該控制項用此資料來源構建其項目
peopleDataList.DataBind();
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
if (!IsPostBack) {
// 首次請求此頁
LoadPeopleList();
}
}
}
public sealed class Person {
private string name;
private Color favoriteColor;
public Person(string name, Color favoriteColor) {
this.name = name;
this.favoriteColor = favoriteColor;
}
public Color FavoriteColor {
get { return favoriteColor; }
}
public string Name {
get { return name; }
}
}
}
在此頁中,控制項的 DataSource 屬性是通過程式設定的,與在 aspx 檔案中聲明性地設定相對。兩種方法的結果相同。無法選擇哪種方法,都必須調用 DataBind 方法,以便控制項可以列舉其資料來源並建立它要表示的項目。
此樣本中所用的資料來源是 Person 對象的一個簡單數組。由於每個數組都實現 ICollection 方法,所以數組適合用作資料來源。這顯示了將資料結構和類型用作資料來源時可獲得的靈活程度。
DataList1 樣本介紹了下列概念:
在模板中定義豐富的 HTML UI
使用簡單數組作為資料來源
通過程式設定資料來源
資料繫結文法中所允許的各種運算式