關於何種情況下使用DataGrid、DataList或Repeater的一些討論

來源:互聯網
上載者:User
datagrid [概述]

  WEB開發自從有了基於指令碼的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的輸出。


[DataGrid控制項]

  在三種控制項當中,DataGrid是迄今為止功能最為豐富的,但也是最不靈活的控制項。這種在輸出HTML時不夠靈活的特點是因為它最初就是被設計成以表格的形式輸出資料。每一條記錄輸出時會建立一對<tr>標籤,而每個欄位的值輸出時則建立一對<td>標籤。

  DataGrid含有幾個屬性可以提高其可用性。如,通過設定DataGrid的AllowSorting屬性為true,並加入少量代碼,DataGrid就具備了按不同欄位排序的功能。此外,設定相關屬性來實現分頁以及單條記錄編輯的功能更加增強了DataGrid的可用性。

  除了在可用性方面的支援以外,DataGrid同時也相當節省開發時間。使用DataGrid在WEB頁面上顯示資料只需要兩行代碼。一行用來設定與DataGrid繫結資料源(DataSource),另一條則用來執行綁定命令(DataBind())。當然,在Repeater中實現這樣的功能並非不可能,只是,相比較使用DataGrid而言,你需要花費相當多的時間和精力來實現這些功能。

  儘管DataGrid有這樣那樣令人印象深刻的優點,它的兩個缺點也同樣不能忽視。首先,如前所述,DataGrid在個人化輸出資料方面功能有限。當然,你可以定製字型、顏色以及線條寬度等等,但它始終只能是HTML表格。

  每個在DataGrid中的列都是DataGridColumn類的一個執行個體。有五種DataGrid列的形式:

  ·BoundColumn
  ·ButtonColumn
  ·EditColumn
  ·HyperLinkColumn
  ·TemplateColumn

  每種類型都會以一種方式允許頁面訪問與DataGrid進行互動。例如,BoundColumn將DataSource的欄位值顯示為純文字;而HyperLinkColumn則將之顯示為一個超級連結。另外,開發人員可以通過寫一個繼承自DataGridColumn的自訂類來定製DataGrid列的樣式。

  儘管DataGrid具有這麼多的增強可用性的屬性,卻仍然顯得死板而不夠靈活。這是因為,不論什麼樣的屬性,都需要對DataGrid所產生的表格進行相關的設定而生效。這無疑會使表格變得臃腫而失去靈活性。例如,DataGridColumn的設定會對錶格的每一行的相應列生效。DataGrid的這種局限性阻礙了更有創意地顯示資料。比如,你希望每五條記錄被顯示在一行,或根本不想要表格來顯示資料,你將不得不放棄使用DataGrid。

  DataGrid的第二個缺陷是它的效能。在三種資料控制項中,DataGrid是相對效能最差的。由DataGrid所產生的ViewState將會相當龐大,特別是在DataGrid含有較多的行時。當然,你也可以關閉ViewState功能,但代價是你將不能使用排序、分頁以及記錄編輯等功能。

  為了測量DataGrid的效能,我使用了微軟的Web Application Stress Tool (WAST)。精確的測試條件設定以及測試用代碼將會在本文的結尾給出。

  WAST將會對WEB伺服器發出對一個特定URL的請求。每個測試將會針對一個URL在一分鐘之內連續不斷地請求。WAST將會一個代表效能的數值,代表WEB伺服器將會在一秒鐘內執行ASP.Net頁面多少次。

  兩個測試將顯示一個僅僅顯示資料的DataGrid。DataGrid將會顯示Northwinds資料庫中的Customers表的4個欄位的內容(總計91條記錄)。DataGrid的AutoGenerateColumns屬性將會被設為True。第一個測試將DataGrid置於一個Form中,第二個則不置於Form中。將控制項置於Form中而不指定其EnableViewState為False,則控制項將會一直使用ViewState來維持其狀態。對ViewState的設定是為了有一個耗時的處理過程,來看一下它對於每秒種的頁面請求有什麼樣的影響。測試結果見圖1。


圖1:對DataGrid的每秒請求次數

  在下面我們要討論並測試的DataList和Repeater中,我們會看到它們的效能將優於DataGrid。


[DataList控制項]

  如前所述,DataGrid使用表格來顯示資料。你也許需要更進一步地控制資料的顯示。例如,你想使資料在表格中顯示,但不是每行只有一條記錄,而是多條。又或者,你並不想使用表格來顯示資料,而是只將它們顯示在一系列<span>標籤中。

  DataList放棄了DataGrid中列表顯示資料的概念,而是使用事先定義好的模板(Template)來定製顯示。通過使用模板,可以同時使用HTML標籤或資料繫結。這裡的資料繫結的形式為:<%# … %>,用來顯示資料來源中給定條目的資料記錄。如下的ItemTemplate將會顯示資料來源中CompanyName欄位:

 <asp:DataList runat="server" id="myDataList">
    <ItemTemplate&



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。