关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
生活随笔
收集整理的這篇文章主要介紹了
关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:Scott Mitchell
[概述]
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>
<%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
</ItemTemplate>
</asp:DataList>
通過修改上面的模板,我們可以使CompanyName字段顯示為粗體字,而ContactName字段則以正常式樣顯示在CompanyName之下。
<asp:DataList runat="server" id="myDataList">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "CompanyName") %></b>
<br />
<%# DataBinder.Eval(Container.DataItem, "ContactName") %>
</ItemTemplate>
</asp:DataList>
對于DataList數據源中的每一條記錄,ItemTemplate會通過定義HTML標簽來以相同的樣式顯示數據。ItemTemplate還支持其它其它6種模板:
·AlternatingItemTemplate
·EditItemTemplate
·FooterTemplate
·HeaderTemplate
·ItemTemplate
·SelectedItemTemplate
·SeparatorTemplate
默認情況下DataList會將記錄顯示在HTML表格中。然而,通過設定RepeatColumn屬性,你可以設置在一行中顯示多少條記錄。更進一步,你甚至可以指定DatList的內容不顯示在表格中,而是<span>標簽中。這可以通過設定RepearLayout屬性來實現。
通過模板、RepeatColumn和RepeatLayout屬性,很明顯DataList在定制數據輸出樣式方面較DataGrid更具靈活性,使得用戶界面設計可以更加友好。當然,我們還需要進行功能性的對比,如分頁、排序、記錄編輯等等。
通過EditItemIndex模板和EditCommand,UpdateCommand以及CancelCommand事件,DataList將支持記錄編輯的功能。不過,比較DataGrid而言,這需要耗費更多的開發時間來實現。這種開發時間上的不一致主要有兩個原因:
·編輯/更新/刪除按鈕在DataGrid中可以通過設定EditCommandColumn來自動添加;而在DataList中則需要手動添加。
·DataGrid的BoundColumn列樣式自動使用文本框控件來顯示記錄編輯界面。而在DataList中,你必須通過EditItemTemplate明確地指定使用什么樣的編輯界面。
實現DataList中的分頁、排序功能同記錄編輯功能情況一樣,并不算非常復雜。這些功能可以通過巧妙的編程加以實現,只是耗費一些開發時間。所以,如果需要用戶對數據記錄進行排序或編輯的話,使用DataGrid要比使用DataList方便得多。
DataList的性能要比DataGrid好一些,特別是當DataList被包含在Form當中時。圖2顯示了WAST對DataList的測試。
圖2:對DataList的每秒請求次數
可以看出,在被Web Form包含的情況下,DataList的性能要明顯好于DataGrid。
[Repeater控件]
Repeater控件是三種數據控件中在HTML輸出方面最為靈活的控件。Repeater會按照你所要求的樣式嚴格地輸出數據記錄。所以,如果你不想以表格方式或者簡單的<span>輸出數據,那么最好使用Repeater。
與DataList一樣,Repeater使用模板來指定輸出樣式。Repeater支持如下五種模板:
·AlternatingItemTemplate
·FooterTemplate
·HeaderTemplate
·ItemTemplate
·SeparatorTemplate
HederTemplate和FooterTemplate指定在真正的記錄輸出之前或之后應處理的HTML內容。AlternatingItemTemplate和ItemTemplate則指定實際的每條輸出記錄的HTML樣式。如,你需要綁定一個包含雇員信息的DataSet到一個Repeater,字段名為EmployeeName。如果你想在頁面中不排序地顯示這些記錄,你可以使用如下的語句:
<asp:Repeater runat="server" id="rptEmployees">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%# DataBinder.Eval(Container.DataItem, "EmployeeName") %></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
Repeater類不是繼承自WebControl類的,這一點與DataGrid和DataList不同。所以,Repeater沒有樣式方面的屬性可供設定。也就是說,如果你想格式化輸出Repeater的數據記錄,你必須使用HTML標簽來設定樣式。如,在一例中,如果我們想將雇員名字顯示成粗體,我們必須在ItemTemplate設置相應的HTML標簽:
<ItemTemplate>
<li><b><%# DataBinder.Eval(Container.DataItem, "EmployeeName")%></b></li>
</ItemTemplate>
而如果使用DataGrid或DataList,我們只通過設定ItemStyle-Font-Bold屬性為True即可實現。
Repeater在格式化設定上的欠缺,直接反映到開發時間的延長上來。對輸出數據樣式上的越多要求,就越會導致開發周期的延長。這些在模板中規定樣式的HTML標簽也越發得顯得混亂,而且,在將來頁面更改時會更加困難,特別是當一個新的開發人員接替工作時。而使用DataGrid或DataList你盡可以只設定樣式屬性,而不使用模板。而且,如果使用Visual Studio.Net或ASP.Net Web Matrix工作時,這些屬性更可以被直接設定而無需編碼。
因為Repeater開發時間的延長,其在內建功能(分頁、排序及編輯)上的支持也顯得不足。因此在可用性方面,Repeater有著明顯的缺陷。當然,<b>如果</b>用戶對于如何顯示數據無所謂的話,這也算不了什么大問題。我之所以強調這個“如果”,是因為盡管用戶有時在設計時并不要求能夠分頁、排序或編輯記錄,但這樣的要求往往會在開發后期,或在他們能看到顯示出來的記錄后產生。
Repeater唯一優于DataGrid和DataList的特點是它的性能,尤其明顯優于DataGrid。而比DataList略高一點點。
[結論]
在ASP.Net頁面上顯示數據時,多數的程序員會選擇他們所熟悉的控件來使用,特別是DataGrid。然而,這樣盲目的選擇在沒有“最好的通用控件”的情況下是不明智的。在選擇控件來顯示數據前,不妨問自己幾個問題來幫助決策:是否允許用戶對記錄排序?是不是記錄需要顯示在非表格的情況下?頁面是否會被高頻度地訪問,因此應多考慮性能?
DataGrid提供了最多的功能,如允許訪問者對記錄編輯、排序或分頁。同時它也是最容易使用的,甚至于簡單到只需要將之添加到頁面中而不必額外編寫代碼。不過這些易用性是以性能的損失為代價的。DataGrid在三種控件中是效率最低的,特別是在使用Web Form的情況下。
通過使用模板,DataList提供了比DataGrid更加優秀的界面效果。不過這需要以犧牲一定的開發時間為代價。為了添加排序、分頁和編輯功能,程序員不得不花費比使用DataGrid更多的精力來進行編碼,雖然它的性能要優于DataGrid。
最后,Repeater允許對數據記錄作最大限度的HTML定制。通常,使用Repeater來顯示數據記錄比使用DataGrid和DataList要耗費更長的開發時間。另外,它不支持內建的編輯、排序和分頁功能。所幸的是,Repeater在性能上要優于其它兩種控件,特別是明顯優于DataGrid。
[附錄]
WAST測試設定
測試是在運行Microsoft Windows 2003 Server操作系統的筆記本電腦上完成的。基本配置如下:Intel P4 2.4G CPU;512 MB RAM;30GB Ultra ATA Hard drive;網頁服務器使用IIS 6.0;ASP.Net版本為1.1。此測試中的WAST被設置成使用單線程,每個測試時間為一分鐘。
測試代碼http://download.microsoft.com/download/9/e/9/9e97b2f8-b317-4751-9ac1-2e34eebec26a/DataControlsPerfTest_Setup.msi點擊此處下載
[概述]
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>
<%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
</ItemTemplate>
</asp:DataList>
通過修改上面的模板,我們可以使CompanyName字段顯示為粗體字,而ContactName字段則以正常式樣顯示在CompanyName之下。
<asp:DataList runat="server" id="myDataList">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "CompanyName") %></b>
<br />
<%# DataBinder.Eval(Container.DataItem, "ContactName") %>
</ItemTemplate>
</asp:DataList>
對于DataList數據源中的每一條記錄,ItemTemplate會通過定義HTML標簽來以相同的樣式顯示數據。ItemTemplate還支持其它其它6種模板:
·AlternatingItemTemplate
·EditItemTemplate
·FooterTemplate
·HeaderTemplate
·ItemTemplate
·SelectedItemTemplate
·SeparatorTemplate
默認情況下DataList會將記錄顯示在HTML表格中。然而,通過設定RepeatColumn屬性,你可以設置在一行中顯示多少條記錄。更進一步,你甚至可以指定DatList的內容不顯示在表格中,而是<span>標簽中。這可以通過設定RepearLayout屬性來實現。
通過模板、RepeatColumn和RepeatLayout屬性,很明顯DataList在定制數據輸出樣式方面較DataGrid更具靈活性,使得用戶界面設計可以更加友好。當然,我們還需要進行功能性的對比,如分頁、排序、記錄編輯等等。
通過EditItemIndex模板和EditCommand,UpdateCommand以及CancelCommand事件,DataList將支持記錄編輯的功能。不過,比較DataGrid而言,這需要耗費更多的開發時間來實現。這種開發時間上的不一致主要有兩個原因:
·編輯/更新/刪除按鈕在DataGrid中可以通過設定EditCommandColumn來自動添加;而在DataList中則需要手動添加。
·DataGrid的BoundColumn列樣式自動使用文本框控件來顯示記錄編輯界面。而在DataList中,你必須通過EditItemTemplate明確地指定使用什么樣的編輯界面。
實現DataList中的分頁、排序功能同記錄編輯功能情況一樣,并不算非常復雜。這些功能可以通過巧妙的編程加以實現,只是耗費一些開發時間。所以,如果需要用戶對數據記錄進行排序或編輯的話,使用DataGrid要比使用DataList方便得多。
DataList的性能要比DataGrid好一些,特別是當DataList被包含在Form當中時。圖2顯示了WAST對DataList的測試。
圖2:對DataList的每秒請求次數
可以看出,在被Web Form包含的情況下,DataList的性能要明顯好于DataGrid。
[Repeater控件]
Repeater控件是三種數據控件中在HTML輸出方面最為靈活的控件。Repeater會按照你所要求的樣式嚴格地輸出數據記錄。所以,如果你不想以表格方式或者簡單的<span>輸出數據,那么最好使用Repeater。
與DataList一樣,Repeater使用模板來指定輸出樣式。Repeater支持如下五種模板:
·AlternatingItemTemplate
·FooterTemplate
·HeaderTemplate
·ItemTemplate
·SeparatorTemplate
HederTemplate和FooterTemplate指定在真正的記錄輸出之前或之后應處理的HTML內容。AlternatingItemTemplate和ItemTemplate則指定實際的每條輸出記錄的HTML樣式。如,你需要綁定一個包含雇員信息的DataSet到一個Repeater,字段名為EmployeeName。如果你想在頁面中不排序地顯示這些記錄,你可以使用如下的語句:
<asp:Repeater runat="server" id="rptEmployees">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%# DataBinder.Eval(Container.DataItem, "EmployeeName") %></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
Repeater類不是繼承自WebControl類的,這一點與DataGrid和DataList不同。所以,Repeater沒有樣式方面的屬性可供設定。也就是說,如果你想格式化輸出Repeater的數據記錄,你必須使用HTML標簽來設定樣式。如,在一例中,如果我們想將雇員名字顯示成粗體,我們必須在ItemTemplate設置相應的HTML標簽:
<ItemTemplate>
<li><b><%# DataBinder.Eval(Container.DataItem, "EmployeeName")%></b></li>
</ItemTemplate>
而如果使用DataGrid或DataList,我們只通過設定ItemStyle-Font-Bold屬性為True即可實現。
Repeater在格式化設定上的欠缺,直接反映到開發時間的延長上來。對輸出數據樣式上的越多要求,就越會導致開發周期的延長。這些在模板中規定樣式的HTML標簽也越發得顯得混亂,而且,在將來頁面更改時會更加困難,特別是當一個新的開發人員接替工作時。而使用DataGrid或DataList你盡可以只設定樣式屬性,而不使用模板。而且,如果使用Visual Studio.Net或ASP.Net Web Matrix工作時,這些屬性更可以被直接設定而無需編碼。
因為Repeater開發時間的延長,其在內建功能(分頁、排序及編輯)上的支持也顯得不足。因此在可用性方面,Repeater有著明顯的缺陷。當然,<b>如果</b>用戶對于如何顯示數據無所謂的話,這也算不了什么大問題。我之所以強調這個“如果”,是因為盡管用戶有時在設計時并不要求能夠分頁、排序或編輯記錄,但這樣的要求往往會在開發后期,或在他們能看到顯示出來的記錄后產生。
Repeater唯一優于DataGrid和DataList的特點是它的性能,尤其明顯優于DataGrid。而比DataList略高一點點。
[結論]
在ASP.Net頁面上顯示數據時,多數的程序員會選擇他們所熟悉的控件來使用,特別是DataGrid。然而,這樣盲目的選擇在沒有“最好的通用控件”的情況下是不明智的。在選擇控件來顯示數據前,不妨問自己幾個問題來幫助決策:是否允許用戶對記錄排序?是不是記錄需要顯示在非表格的情況下?頁面是否會被高頻度地訪問,因此應多考慮性能?
DataGrid提供了最多的功能,如允許訪問者對記錄編輯、排序或分頁。同時它也是最容易使用的,甚至于簡單到只需要將之添加到頁面中而不必額外編寫代碼。不過這些易用性是以性能的損失為代價的。DataGrid在三種控件中是效率最低的,特別是在使用Web Form的情況下。
通過使用模板,DataList提供了比DataGrid更加優秀的界面效果。不過這需要以犧牲一定的開發時間為代價。為了添加排序、分頁和編輯功能,程序員不得不花費比使用DataGrid更多的精力來進行編碼,雖然它的性能要優于DataGrid。
最后,Repeater允許對數據記錄作最大限度的HTML定制。通常,使用Repeater來顯示數據記錄比使用DataGrid和DataList要耗費更長的開發時間。另外,它不支持內建的編輯、排序和分頁功能。所幸的是,Repeater在性能上要優于其它兩種控件,特別是明顯優于DataGrid。
[附錄]
WAST測試設定
測試是在運行Microsoft Windows 2003 Server操作系統的筆記本電腦上完成的。基本配置如下:Intel P4 2.4G CPU;512 MB RAM;30GB Ultra ATA Hard drive;網頁服務器使用IIS 6.0;ASP.Net版本為1.1。此測試中的WAST被設置成使用單線程,每個測試時間為一分鐘。
測試代碼http://download.microsoft.com/download/9/e/9/9e97b2f8-b317-4751-9ac1-2e34eebec26a/DataControlsPerfTest_Setup.msi點擊此處下載
總結
以上是生活随笔為你收集整理的关于何种情况下使用DataGrid、DataList或Repeater的一些讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单链表功能大全
- 下一篇: Repeater控件的分页问题