關于何種情況下使用DataGrid、DataList或Repeater的一些討論(1)
2024-07-21 02:16:31
供稿:網友
 
作者:scott mitchell
 
[概述]
 
  自從有了基于腳本的web編程技術(如asp)以來,經歷了一個漫長的過程。通過使用微軟的asp.net技術,傳統的asp中大量的、單調乏味的、重復性的編程工作成為了歷史。例如,象大多數asp程序員所知的,在asp中顯示數據庫內容所需要的過程:
 
  建立數據庫連接
  用sql查詢裝載ado數據集
  顯示所需要的任何html代碼
  遍歷數據集中的記錄
    輸出記錄字段值及相關的html
    移向下一條記錄
  循環
  顯示所需要的html代碼
 
  又如,為了在表格中顯示記錄集的內容,我們需要輸出一個<table>標簽,然后開始循環。在循環中,每輸出一條記錄,需要先輸出一個<tr>標簽以及若干對<td>標簽和</tr>標簽。最后,以一個</table>標簽結尾。
  在傳統的asp中使用的這種方法有一個主要的缺點:html代碼與asp源代碼不得不糾纏在一起。對于那些也許并不理解程序設計的頁面設計者或圖形藝術家來說,想要更改html內容無疑是一場災難。另外,代碼的產生量也是驚人的,因為我們不僅需要從數據庫中取得數據,還需要使之可視化。
  好在,asp.net提供了三個數據控件,使得原本在asp中繁雜的工作變得簡單。這三個控件屬于數據web控件,分別是datagrid,datalist和repeater。如果你對asp.net數據庫編程有所了解的話,你至少應該有使用其中一種控件的經驗。大多數情況下,我們從學習使用datagrid開始,因為它的功能相對完整(數據顯示、分頁、編輯)并相對簡單。然而,datagrid并非總是正確的選擇。
  本文將分別論述每個數據控件不同于其它數據控件的特點,以及由此帶來的優缺點。正因為每種數據控件都有其自身的缺陷,因此在程序設計中并不存在最完美的選擇。你必須權衡三種控件的優缺點并決定哪一種更加適合你的程序。
  為了幫助比較,在對每個控件進行論述時,我們會專注于三個特性:可用性(從頁面訪問者的角度)、開發時間和性能。我們首先描述一下這三種控件的共性,然后分別深入地討論三種控件的特點,每種控件如何實現以及如何體現可用性、開發時間和性能。
 
[數據控件(data web controls)的共同點]
 
  在我們討論三種控件各自特性之前,有必要先看一看它們之間的共同點。一般來說,從編程流程來看,最顯著的共同點就是,這三種控件都是用來顯示數據的。另一個共同點是需要一個數據綁定的代碼來將數據與控件綁定。這個過程只需要兩行代碼:
  
  datawebcontrolid.datasource = somedatasource
  datawebcontrolid.databind()
  
  一般情況下,somedatasource對象是指數據控件的數據源屬性,可以是dataset,sqldatareader,oledbdatareader或一組數據(如數組、數組列表或其它的屬于system.collection名空間的類)。不過,任意實現ienumerable接口的對象也可以被綁定在數據控件上。
  databind()方法遍歷一個特定的datasource中的記錄,并對其中的每條記錄,建立一個條目并對應數據控件的item集。數據控件中的每個條目將成為一個類的實例。這個類因數據控件的不同而有所區別。例如,datagrid中的每個條目是datagriditem類的一個實例,而repeater中的條目則是repeateritem類的一個實例。
  之所以使用不同的類來實例化不同數據控件的條目,是因為不同的數據控件將會使用不同的方式顯示數據及相應的html代碼。例如,datagriditem類繼承自tablerow類,也就是說,每個datagriditem的實例或多或少地可以看成一個表格中的一行。這是因為datagrid被設計成可以借助html中的<table>標簽以表格的形式顯示數據,因此每條記錄就是一個表格行。而repeater則被設計成可以自由定義數據輸出的方式。所以,repeateritem并不繼承自tablerow就不奇怪了。
  另一個三種數據控件的相同點是每種控件都被允許使用模板來顯示數據。datalist和repeater控件必須使用模板來輸出數據,而datagrid則允許通過templatecolumn而只使用模板來顯示一列(在datagrod單元中詳細論述)。
  另一個不是十分值得比較的地方是:datagrid和datalist都是繼承自webcontrol類,而repeater則是繼承自control類。webcontrol類包含一些用于美化的屬性,如:backcolor、forecolor、cssclass、borderstyle等等。這說明在使用datagrid或datalist時,你可以設定這些屬性來個性化輸出。repeater控件則不具有這些屬性。我們會在repeater單元討論如何使用模板來美化repeater的輸出。