明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

使用 ASP+ 下文綁定控件(上)

[摘要]簡介   Repeater、DataList和DataGrid控件構成ASP+頁面框架中System.Web. UI.WebControls名稱空間內的相關Web控件集。這些控件使HTML顯示所綁 ...
簡介

  Repeater、DataList和DataGrid控件構成ASP+頁面框架中System.Web.
UI.WebControls名稱空間內的相關Web控件集。這些控件使HTML顯示所綁
定列表或數(shù)據(jù)源的內容。因此,將它們統(tǒng)稱為“列表綁定控件”。

與框架中的其它 Web

  控件類似,這些控件提供一致的編程模型并封裝一個獨立于瀏覽器的
表示邏輯。這些特性使開發(fā)人員能夠針對對象模型編程而不用必須掌握與
HTML 相關的那些不一致的和復雜的技術知識。

  這三種控件可以按多種布局(包括列表、分欄/報紙欄目和流布局
(HTML流))來表示與其相關的數(shù)據(jù)源內容。此外,它們還允許您創(chuàng)建完
全不同的或完全定制的布局。除了封裝有表示邏輯外,還提供了用來處理
已發(fā)送數(shù)據(jù)、執(zhí)行狀態(tài)管理和引發(fā)事件的功能。最后,它們還對諸如選擇、
編輯、分頁和排序之類的標準操作提供不同級別的支持。這些控件可以簡
化幾種常見的 Web 應用程序方案,包括報表、購物車、產(chǎn)品列表、查詢
結果和導航菜單。

  下面幾節(jié)將進一步說明這些控件和如何在您的 Web 應用程序中使用
它們,以及如何選用控件。

列表綁定控件是如何工作的?

  本節(jié)是本文其余部分的背景材料。概述了這些列表綁定控件的工作方
式、它們的共同特性以及某些相關概念。

DataSource 屬性
  每個控件都有一個DataSource屬性,其類型為System.Collections.
ICollection。用最簡單的話來說,數(shù)據(jù)源是同類對象的一個列表或集合。

  此框架中有幾個對象提供了 ICollection 的實現(xiàn)。這個集合包括
System.Data.DataView(它通常用來訪問關系數(shù)據(jù)庫和 XML 數(shù)據(jù))、一
般ICollection實現(xiàn)(如ArrayList和Hashtable)以及數(shù)組。

  與傳統(tǒng)的數(shù)據(jù)綁定控件(它們通常需要ADO記錄集)不同,除了實現(xiàn)
ICollection接口之外,這些列表綁定控件未對其數(shù)據(jù)源強加任何其它要
求。根據(jù)設計,通過大量增加可作為有效DataSource屬性值的類型和數(shù)據(jù)
結構,它們能夠為您的應用程序代碼實現(xiàn)最大程度的簡單和靈活性。

項目集合

  每個列表綁定控件都包含一個項目集合。控件通過列舉這些對象當前
的數(shù)據(jù)源來置入其項目集合。在列舉中為每個對象創(chuàng)建單個項目并用于表
示該對象。這些項目同時成為列表綁定控件中包含的控件層次結構的一部
分。

下表列出了與數(shù)據(jù)源的數(shù)據(jù)相關聯(lián)的項目類型。

項目 創(chuàng)建的默認項目類型
AlternatingItem 為項目集合中具有奇數(shù)下標的項目創(chuàng)建
SelectedItem 為選定的項目創(chuàng)建(不論該項目是否為備選項目)
EditItem 為處于編輯模式下的項目創(chuàng)建(不管它是否被選中或是否為備選項目)


  控件同時創(chuàng)建將在表示中用到的下列項目。但是,它們并不與數(shù)據(jù)源
的數(shù)據(jù)相關聯(lián)。

標頭 用來表示標頭信息
注腳 用來表示注腳信息
分隔符 用來表示圖 1 中所示的每個項目之間的內容,并且僅適用于 Repeater 和 DataList
分頁符 用來表示與 DataGrid 控件相關聯(lián)的分頁 UI

      

項目的數(shù)據(jù)綁定和創(chuàng)建

  列表綁定控件遵循在整個 ASP+ 框架中實現(xiàn)的顯式數(shù)據(jù)綁定模型。這
意味著控件僅當其 DataBind 方法被調用時才需要并列舉其數(shù)據(jù)源。

當調用 DataBind

  方法時,列表控件將列舉其數(shù)據(jù)源、創(chuàng)建項目并通過從其數(shù)據(jù)源中提
取值來對其進行初始化。如果啟用了狀態(tài)管理,則控件還將保存所需的全
部信息,以便在頁面的回傳處理期間重新創(chuàng)建其項目而無須重新設置數(shù)據(jù)
源。

  顯式數(shù)據(jù)綁定模型使您的應用程序代碼可以精確地確定在處理序列中
何時及何處需要數(shù)據(jù)源。這種功能使對數(shù)據(jù)庫服務器的訪問更少且更高效,
而這些訪問通常是 Web 應用程序最耗費資源的操作。

  一般規(guī)則是每當您需要重新創(chuàng)建項目時都必須調用DataBind。在大多
數(shù)情況下,您將在您的頁面首次被請求創(chuàng)建初始項目集合時調用DataBind。
在該頁面的后續(xù)執(zhí)行過程中,您將需要在引起項目集合被更改的各種事件
處理程序中調用此方法。當用于創(chuàng)建初始數(shù)據(jù)源的查詢被修改時,就可能
發(fā)生這種情況。當項目的狀態(tài)改變(如從只讀模式變?yōu)榫庉嬆J剑⿻r也可
能發(fā)生這種情況。

樣式

  通過在對象模型上使用樣式屬性,您可以定義全部DataList和DataGrid
控件及其所包含項目的格式和外觀。這些屬性允許定制字體、顏色、邊框
和其它外觀因素。控件本身的樣式屬性(如前景色、背景色、字體和邊框
樣式)將影響整個控件的表示。

  此外,每個控件都包含與其所創(chuàng)建的項目類型相匹配的大量樣式屬性,
如as ItemStyle、AlternatingItemStyle和headerStyle。DataGrid提供
第三級的樣式屬性,這些屬性將影響特定列的所有單元格?丶邪
每一列都可以擁有其自己的 headerStyle、FooterStyle 和 ItemStyle。

模板

  樣式控制格式顯示,而模板則定義每個項目的內容和表示。您可以將
模板看作HTML代碼片斷,它定義了用來表示項目的控件層次結構。

  Repeater 和 DataList 控件由您指定的模板來驅動,提供各種可設
置的模板屬性,如ItemTemplate、AlternatingItemTemplate和header
Template。與樣式類似,每個模板都對應于一個特定類型的項目。

  DataGrid 控件未模板化。但是,控件的 Column 集合中的 Template
Columns使DataGrid中模板的使用成為可能。TemplateColumn中的每個單
元格都可以包含一個模板,這與 Repeater 或 DataList 控件中的項目極
為類似。這也使 DataGrid 中的定制表示成為可能。

模板中的數(shù)據(jù)綁定

  模板定義項目中包含的控件層次結構。通過使用數(shù)據(jù)綁定表達式,此
層次結構中的控件屬性可綁定到與此項目相關聯(lián)的數(shù)據(jù)屬性上。

  作為模板的邏輯父級的項目在數(shù)據(jù)綁定表達式中被稱為“容器”。每
個容器都有一個稱為DataItem的屬性,該屬性引用其相關聯(lián)的數(shù)據(jù)。結果
是,模板中的大多數(shù)典型數(shù)據(jù)綁定表達式都將控件屬性綁定到 Container.
DataItem的某個屬性上。將在以下幾節(jié)介紹的示例中進一步說明這種綁定。

Repeater 控件

  如前面所述,Repeater控件是完全由模板驅動的,允許創(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文件顯示了一個用于生成帶項目符號列表的 repeater控件的
聲明。

  此示例說明了用數(shù)據(jù)綁定語法(〈%#...%〉)設置數(shù)據(jù)源的聲明方法。
當您調用 DataBind 方法時,數(shù)據(jù)綁定中的表達式就會被執(zhí)行。在這種情
況下,repeater 的 DataSource 屬性被綁定到頁面的 SiteLinks 屬性上,
后者包含要顯示的 URL 引用。

  Repeater是唯一允許在其模板中存在 HTML片段的控件,將 Repeater
控件和HTML片段合在一起會產(chǎn)生良好形式的HTML。在本示例中,帶項目符
號的列表分為三個部分:

  由 headerTemplate 表示的列表開始標記 (〈ul type="1"〉)。

  由 FooterTemplate 表示的列表結束標記 (〈/ul〉)。

  列表的主體由通過為 SiteLinks 集合中出現(xiàn)的每個對象重復 Item
Template 而生成的列表項 (〈li〉) 置入。

  您也可以使用這些模板在標頭中指定表的開始標記(〈TABLE〉),在注
腳中指定表的結束標記(〈/TABLE〉),在每個項目中指定單個表行(〈TR〉)。此替換選項將導致列表表示。

  您必須指定 ItemTemplate。它是唯一必需的模板。當未指定其它模
板時,控件會自動將此 ItemTemplate 用于其它模板。

  在以下示例中,ItemTemplate 包含一個 HyperLink Web 控件。此控
件的Text和NavigateUrl屬性被綁定到與每個重復項目相關聯(lián)的數(shù)據(jù)屬性
上。這又是使用數(shù)據(jù)綁定表達式(在創(chuàng)建項目后立即對該表達式求值)完
成的。

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) {
       // 首次請求該頁時即對其進行數(shù)據(jù)綁定 (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 頁一起出現(xiàn)的代碼。