|
簡介
自從出現(xiàn)了像 Microsoft Active Server Pages (ASP) 這樣的簡單且基于腳本的 Web 編程技術(shù)以來,Web 開發(fā)又有了很大的發(fā)展。 傳統(tǒng) ASP 中常見的大量枯燥、重復(fù)的編碼工作,在 Microsoft ASP.NET 中不復(fù)存在了。 例如,正如所有傳統(tǒng) ASP 開發(fā)人員一度都知道的那樣,在傳統(tǒng) ASP Web 頁面中顯示數(shù)據(jù)需要下面的偽代碼:
Create connection to the database
Populate an ADO Recordset with a SQL query
Display any header HTML needed
For Each Record in the Recordset
Print out the Recordset field(s) and associated HTML
Move to the next record
Next
Display any footer HTML needed
例如,要在 HTML <table> 中顯示記錄集的內(nèi)容,開發(fā)人員則不得不為 <table> 標(biāo)記 (tag) 生成 HTML 標(biāo)記 (markup),然后循環(huán)遍歷記錄集中的每一條記錄,每次循環(huán)生成一個 <tr> 標(biāo)記,以及許多 <td> 標(biāo)記和要顯示的記錄集字段的值。 最后,在循環(huán)之后,開發(fā)人員需要生成結(jié)束 <table> 標(biāo)記。
傳統(tǒng) ASP 所要求的這種方法有一個很大的缺點: 它把 HTML 內(nèi)容和 ASP Web 頁面的源代碼緊密集成在一起。 因為沒有分離代碼和 HTML 內(nèi)容,所以更改 HTML 的內(nèi)容及其困難,尤其是對不懂編程技術(shù)的圖形藝術(shù)家或 Web 設(shè)計者來說更是如此。 而且,因為檢索數(shù)據(jù)庫結(jié)果和生成它的內(nèi)容都需要代碼,所以代碼和 HTML 內(nèi)容的這種集成相對來說需要大量的代碼。
幸好,ASP.NET 提供了三個控件,使得在 ASP.NET Web 頁面中顯示數(shù)據(jù)絕對比傳統(tǒng) ASP 所需的迭代方式簡單得多。 這三個控件是 DataGrid、DataList 和 Repeater,以后我將稱之為數(shù)據(jù) Web 控件。 也許,如果您已經(jīng)開發(fā)過 ASP.NET Web 頁面,那么至少會對這三個控件中的一個有一些經(jīng)驗。 通常,開發(fā)人員從學(xué)習(xí) DataGrid 開始,這是因為 DataGrid 使用簡單以及它具有允許數(shù)據(jù)排序、分頁和編輯的功能。 但是,在 ASP.NET Web 頁面中顯示數(shù)據(jù)時,DataGrid 并不總是控件的最佳選擇。
在本文中,我們將研究這些數(shù)據(jù) Web 控件中每個控件的獨特特性。 這些特性賦予每個數(shù)據(jù) Web 控件許多優(yōu)點和缺點。 因為每一個數(shù)據(jù) Web 控件都有一些缺點,所以沒有可用于任何作業(yè)的“完美”控件。 決定使用哪個控件時,必須權(quán)衡這三個數(shù)據(jù) Web 控件每一個的優(yōu)點和缺點,然后再決定哪個控件是最合適的。
為了協(xié)助進(jìn)行比較,研究每一個數(shù)據(jù) Web 控件時,我們將著重于這三個衡量標(biāo)準(zhǔn): 可用性(從 Web 訪問者的角度)、開發(fā)時間和性能。 我們首先快速瀏覽一下這三個數(shù)據(jù) Web 控件之間的相似性。 接下來我們將深入研究 DataGrid,然后研究 DataList,最后查看 Repeater。 對于每一個控件,我們將研究這些控件的功能,并討論它的功能集是如何影響這些衡量標(biāo)準(zhǔn)的。
返回頁首
數(shù)據(jù) Web 控件之間的相似性
在研究數(shù)據(jù) Web 控件之間的差異(這些差異使它們區(qū)別于其他控件)之前,先看一下它們的相似性。 從較高級別觀點來看,最基本的相似性是,DataGrid、DataList 和 Repeater都設(shè)計為了執(zhí)行大致相同的操作: 顯示數(shù)據(jù)。 另一個相似性把數(shù)據(jù)綁定到數(shù)據(jù) Web 控件所需的代碼。 具體地說,只需要下面兩行代碼:
dataWebControlID.DataSource = someDataSource
dataWebControlID.DataBind()
通常,賦給數(shù)據(jù) Web 控件的 DataSource 屬性的 someDataSource 對象是一個 DataSet、SqlDataReader、OleDbDataReader 或一個集合(如 Array、ArrayList 或 System.Collections 命名空間中的其他某個類)。 但是,任何實現(xiàn) IEnumerable 接口的對象都可以綁定到數(shù)據(jù) Web 控件。
DataBind() 方法枚舉指定的 DataSource 中的記錄。 對于 DataSource 中的每一條記錄,都會創(chuàng)建一個項并追加到數(shù)據(jù) Web 控件的 Items 集合中。 數(shù)據(jù) Web 控件中的每一項都是一個類實例。 用于控件每一項的特定類取決于該數(shù)據(jù) Web 控件。 例如,DataGrid 中的每一項都是 DataGridItem 類的一個實例,而 Repeater 中的每一項都是 RepeaterItem 類的一個實例。
每個數(shù)據(jù) Web 控件會為它的每一項使用不同的類,因為是這些項呈現(xiàn)的方式?jīng)Q定了數(shù)據(jù) Web 控件生成的 HTML 標(biāo)記。 例如,DataGridItem 類是從 TableRow 類中派生的,這意味著每個 DataGridItem 都或多或少地呈現(xiàn)為一個表行。 這很有意義,因為 DataGrid 設(shè)計為在 HTML <table> 標(biāo)記內(nèi)以表格形式顯示數(shù)據(jù),在 HTML <table> 中,每一項都呈現(xiàn)為單獨一行。 另一方面,Repeater 設(shè)計為允許對它的輸出進(jìn)行完全自定義。 因此,RepeaterItem 類不從 TableRow 類中派生并不令人驚訝。
數(shù)據(jù) Web 控件之間的另一個相似性是每個控件都能使用模板提供高度自定義的輸出。 DataList 和 Repeater 控件必須 使用模板指定它們的內(nèi)容,而 DataGrid 則通過 TemplateColumn 列類型可以為特定的列選擇使用模板(我們將在下一節(jié)“研究 DataGrid Web 控件”中討論各種不同的 DataGrid 列類型)。
最后一個值得注意的是 DataGrid 和 DataList 控件是從 WebControl 類中派生的,而 Repeater 控件是從 Control 類中派生的。 WebControl 類包含許多美學(xué)方面的屬性,例如 BackColor、ForeColor、CssClass、BorderStyle 等。 這意味著如果使用 DataGrid 和 DataList,就可以通過它們從 WebControl 類中繼承的屬性指定樣式設(shè)置。 而 Repeater 沒有任何這樣的樣式屬性。 正如我們將在“深入研究 Repeater”一節(jié)中所討論的一樣,對 Repeater 輸出的任何可視設(shè)置都必須在 Repeater 的模板中指定。
返回頁首
研究 DataGrid Web 控件
DataGrid Web 控件是這三個數(shù)據(jù) Web 控件中功能最多的,但是在自定義控件生成的實際 HTML 標(biāo)記時,它又是最不靈活的。 呈現(xiàn)的 HTML 標(biāo)記中的這種不靈活性,是由于 DataGrid 是設(shè)計用于使用 HTML <table> 以表格形式顯示數(shù)據(jù)所造成的。 因此,對于每一條綁定到 DataGrid 的記錄,都會創(chuàng)建一個單獨的表行(<tr>),對于要顯示的記錄中的每一個字段,都會創(chuàng)建一個單獨的表列(<td>)。
DataGrid 提供了許多功能,可極大地提高要顯示的數(shù)據(jù)的可用性。 例如,把 DataGrid 的 AllowSorting 屬性設(shè)置為 True 并添加一點源代碼,開發(fā)人員就可以把一個普通的 DataGrid 變成一個其數(shù)據(jù)可以由最終用戶排序的 DataGrid。 另外,再增加一點工作量,開發(fā)人員就能增強(qiáng) DataGrid 的功能以允許數(shù)據(jù)分頁或數(shù)據(jù)的內(nèi)聯(lián)編輯。 這些功能明顯增強(qiáng)了 DataGrid 的可用性。
除了在可用性方面得分很高,DataGrid 還提供了很短的開發(fā)時間。 要使用 DataGrid 開始在 ASP.NET Web 頁面中顯示數(shù)據(jù),只需要把 DataGrid 添加到 Web 頁面中并編寫兩行必要的代碼: 第一行把數(shù)據(jù)綁定到 DataGrid 的 DataSource,第二行調(diào)用 DataGrid 的 DataBind() 方法。 顯然,隨著添加到 DataGrid 中的功能數(shù)量的增加,開發(fā)時間也增加了,但這只是把開發(fā)時間和其他數(shù)據(jù) Web 控件進(jìn)行比較。 假設(shè)您要允許對 Repeater 顯示的數(shù)據(jù)進(jìn)行排序。 添加這樣的功能是一定可能的,但是與用 DataGrid 完成同樣的操作相比,這需要明顯多很多的時間和精力。
盡管 DataGrid 具有良好的可用性和開發(fā)時間得分,但是這個控件有兩個固有的缺點。 第一,正如前面所談到的,DataGrid 在對所呈現(xiàn)的 HTML 標(biāo)記進(jìn)行自定義方面的功能很有限。 是的,您可以自定義 DataGrid 的不同行和列的字體、顏色和邊框,但是事實仍然是,當(dāng) DataGrid 顯示數(shù)據(jù)時,結(jié)果將是一個 HTML <table>,DataSource 中的每一條記錄都對應(yīng)其中一個 <tr>,每一個字段都對應(yīng)其中一個 <td>。
具體地說,DataGrid 中的每一列都是一個從 DataGridColumn 類中派生的類實例。 有五個內(nèi)置的 DataGrid 列類型:
• BoundColumn
• ButtonColumn
• EditColumn
• HyperLinkColumn
• TemplateColumn
每一個列類型都提供數(shù)據(jù)或提供某種允許用戶和 DataGrid 進(jìn)行交互的接口。 例如,BoundColumn 以純文本顯示 DataSource 字段的值,而 HyperLinkColumn 則會顯示一個超級鏈接,其文字和 URL 部分可能是 DataSource 字段。 除了這些內(nèi)置的列類型,通過創(chuàng)建 DataGridColumn 類的派生類,還可以創(chuàng)建自定義 DataGrid 列類型。 (有關(guān)創(chuàng)建一個用于擴(kuò)展 BoundColumn 功能以限制顯示字符數(shù)的列的示例,請參閱 Creating a Custom DataGridColumn Class。)
有了這么多的 DataGrid 列類型,可能就不理解為什么 DataGrid 呈現(xiàn)的 HTML 標(biāo)記不能進(jìn)行高度自定義了。 要知道,雖然每一個 DataGrid 列類型在呈現(xiàn)時生成不同的 HTML,但是每一列都包含在一組 <td> 標(biāo)記中,每一行都包含在一組 <tr> 標(biāo)記中。 因此,即使可以用 TemplateColumn 自定義每一行的特定列的 HTML 輸出,而 DataGrid 仍然呈現(xiàn)為 HTML <table>,其中每一行使用一個 <tr>,每一列使用一個 <td> 。 DataGrid 的這種限制禁止了更多具有創(chuàng)造性的數(shù)據(jù)顯示。 例如,如果要在每一表行中顯示五條記錄,就不能使用 DataGrid,必須使用DataList 或 Repeater。 另外,如果要在除 <table> 之外的 HTML 標(biāo)記中顯示數(shù)據(jù),很遺憾,就不能使用 DataGrid 了。
DataGrid 第二個缺點是它的性能。 DataGrid 是這三個數(shù)據(jù) Web 控件中性能最差的。 基于這一點,由 DataGrid - 特別是具有許多行的 DataGrids - 產(chǎn)生的 ViewState 可能會非常大。 如果使用 DataGrid 僅僅是為了顯示數(shù)據(jù),則可以關(guān)閉 ViewState,但是,使用 DataGrid 的排序、分頁或編輯功能時,就不能這樣做了。
為了測試 DataGrid 的性能,我使用了 Microsoft 的免費 Web Application Stress Tool (WAST)。 在本文最后的“基準(zhǔn)設(shè)置”一節(jié)中列出了精確的測試條件和 WAST 設(shè)置。 另外,測試使用的代碼也可在本文最后下載。
這個 Web Application Stress Tool 會向 Web 服務(wù)器發(fā)出一組特定的 URL 請求。 對于每一項測試,我都在一分鐘之內(nèi)盡可能快地不斷請求一個 URL。 WAST 報告了許多性能衡量標(biāo)準(zhǔn);我要關(guān)注的一個衡量標(biāo)準(zhǔn)是每秒請求數(shù),它表明了 Web 服務(wù)器每秒能執(zhí)行多少次 ASP.NET Web 頁面。
對于一個僅顯示數(shù)據(jù)的簡單 DataGrid,運行了兩個測試。 具體地說,DataGrid 顯示了來自 Northwinds 數(shù)據(jù)庫的 Customers 表(Customers 表總共包含 91 條記錄)的四個字段。 DataGrid 的 AutoGenerateColumns 屬性設(shè)置為 True。 第一項測試把 DataGrid 放在一個 Web 窗體( <form runat="server">)中,而第二項測試則沒有。 如果在窗體中放置一個控件而不把它的 EnableViewState 屬性顯式設(shè)置為 False,那么該控件則會用 ViewState 保持它的狀態(tài)。 創(chuàng)建這個 ViewState 項可能是一個比較費時的過程,因此減少了可處理的總的每秒請求數(shù),結(jié)果如圖 1 所示。
圖 1: DataGrid 的每秒請求數(shù)
正如我們將要在研究 DataList 和 Repeater 時看到的一樣,這兩個控件都提供了比 DataGrid 更好的性能。
返回頁首
分析 DataList
記得 DataGrid 將呈現(xiàn)為 HTML <table>,每一個 DataSource 記錄作為一個表行(<tr>),每一個記錄字段作為一個表列(<td>)。 有時,您可能想更多地控制數(shù)據(jù)的顯示。 例如,您可能想把數(shù)據(jù)顯示在 HTML <table> 中,但不是每行顯示一條記錄,而是每行顯示五條記錄。 或者,您根本不想把數(shù)據(jù)顯示在 <table> 標(biāo)記中,而是想把每個元素顯示在一個 <span> 標(biāo)記中。
DataList 放棄了 DataGrid 所采用的“列”概念。 相反,DataList 的顯示是通過模板 定義的。 利用模板,開發(fā)人員可以指定混合的 HTML 語法和數(shù)據(jù)綁定語法。 HTML 語法是標(biāo)準(zhǔn)的 HTML 標(biāo)記;數(shù)據(jù)綁定語法是使用 <%# 和 %> 標(biāo)記分隔的,用于從 DataSource 的記錄中產(chǎn)生用于構(gòu)造給定 DataList 項的內(nèi)容。 例如,下面的 ItemTemplate 將顯示 DataSource 的字段 CompanyName:
<ASP:DataList runat="server" id="myDataList">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
</ItemTemplate>
</ASP:DataList>
除了數(shù)據(jù)綁定語法,模板也可以包含 HTML 標(biāo)記。 通過更新上面的模板,可以使 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 的 DataSource 中的每一條記錄,都要計算 ItemTemplate 的數(shù)據(jù)綁定語法。 數(shù)據(jù)綁定語法的輸出與 HTML 標(biāo)記一起指定了為 DataList 項呈現(xiàn)的 HTML。 DataList 還支持其他六個模板,包括 ItemTemplate在內(nèi)共有如下七個:
• AlternatingItemTemplate
• EditItemTemplate
• FooterTemplate
• HeaderTemplate
• ItemTemplate
• SelectedItemTemplate
• SeparatorTemplate
注意,DataGrid 的 TemplateColumn 僅支持四個模板: ItemTemplate、HeaderTemplate、FooterTemplate 和 EditItemTemplate。
默認(rèn)情況下,DataList 將每一項都顯示為 HTML <table> 中的一行。 但是,通過設(shè)置 RepeatColumns 屬性,您可以指定表的每一行顯示多少個 DataList 項。 除了可以指定 HTML <table> 的每一行顯示多少個 DataList 項之外,還可以指定 DataList 的內(nèi)容應(yīng)該使用 <span> 標(biāo)記顯示,而不是使用 <table> 標(biāo)記。 DataList 的 RepeatLayout 屬性可以設(shè)置為 Table 或 Flow,表示 DataList 中的數(shù)據(jù)呈現(xiàn)在 HTML <table> 中還是 <span> 標(biāo)記中。
利用模板以及 RepeatColumns 和 RepeatLayout 屬性,很明顯 DataList 比 DataGrid 允許對呈現(xiàn)的 HTML 標(biāo)記進(jìn)行更多的自定義。 這種增強(qiáng)了的自定義使得使用 DataList 能夠產(chǎn)生更為友好的數(shù)據(jù)顯示,因為 DataGrid 的“每一條 DataSource 記錄占用一個表行的單 HTML <table>”模型不可能總是用于顯示信息的最佳選擇。 但是,只研究比 DataGrid 改進(jìn)了的自定義并不足以確定 DataList 的可用性;我們還必須比較 DataGrid 和 DataList 的排序、分頁和編輯功能。
使用 EditItemIndex 模板以及 EditCommand、UpdateCommand 和 CancelCommand 事件,DataList 可以支持內(nèi)聯(lián)編輯。 但是,用 DataList 添加這樣的功能比用 DataGrid 花費的開發(fā)時間要長。 開發(fā)時間的差異是由于下面兩個原因:
• 通過 EditCommandColumn 列類型即可在 DataGrid 中創(chuàng)建的編輯/更新/取消按鈕,必須手動添加到 DataList 中,以及
• DataGrid BoundColumn 列類型自動使用 TextBox Web 控件作為編輯接口,而使用 DataList 時必須通過 EditItemTemplate 為要編輯的項顯式指定的編輯接口。
雖然用 DataList 進(jìn)行內(nèi)聯(lián)編輯不是很困難,但是 DataList 的數(shù)據(jù)排序、分頁和編輯卻很困難。 雖然一些靈活的編碼肯定能完成這樣的功能,但是向 DataList 中添加這樣的功能將花費相當(dāng)多的開發(fā)時間。 因此,如果最終用戶能對數(shù)據(jù)進(jìn)行排序和分頁是一個必需要求的話,那么最好選擇 DataGrid 而不選擇 DataList。
DataList 的性能比 DataGrid 的性能好,當(dāng) DataList 位于 Web 窗體內(nèi)時這一點更明顯。 圖 2 顯示了 Web Application Stress Tool 在 DataList 上的測試結(jié)果。
圖 2: DataList 的每秒請求數(shù)
正如圖 2 中的結(jié)果顯示的那樣,當(dāng) DataList 放置在 Web 窗體內(nèi)時(因此導(dǎo)致該 Web 控件生成它的 ViewState),該 Web 控件要遠(yuǎn)勝于 DataGrid。
返回頁首
深入研究 Repeater
在所有這三個數(shù)據(jù) Web 控件中,Repeater Web 控件在呈現(xiàn)的 HTML 里提供了最大的靈活性。 DataGrid 或 DataList 會在預(yù)設(shè)的 HTML 標(biāo)記中自動包含開發(fā)人員指定的內(nèi)容。與它們不同的是,Repeater 在呈現(xiàn)的時候?qū)?yán)格生成指定的 HTML 標(biāo)記。 因此,如果不想用 HTML <table>或者一系列 <span> 標(biāo)記顯示數(shù)據(jù),而希望以其他方式顯示數(shù)據(jù),就必須使用 Repeater 控件。
就像 DataList 一樣,使用 Repeater 時要用模板指定標(biāo)記。 Repeater 包含下列五個模板:
• AlternatingItemTemplate
• FooterTemplate
• HeaderTemplate
• ItemTemplate
• SeparatorTemplate
HeaderTemplate 和 FooterTemplate 指定出現(xiàn)在綁定到 Repeater 的數(shù)據(jù)之前和之后的 HTML 標(biāo)記。 AlternatingItemTemplate 和 ItemTemplate 指定用于呈現(xiàn) Repeater 的 DataSource 中的每條記錄的 HTML 標(biāo)記和數(shù)據(jù)綁定語法。 例如,假設(shè)您要把包含雇員信息的數(shù)據(jù)集綁定到 Repeater,該數(shù)據(jù)集的其中一個字段是 EmployeeName。 如果要在 Web 頁上以無序列表的形式顯示雇員列表,則可以使用如下 Repeater 語法:
<ASP:Repeater runat="server" id="rptEmployees">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%# DataBinder.Eval(Container.DataItem, "EmployeeName") %></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</ASP:Repeater>
與 DataGrid 和 DataList 不同,Repeater 類不是從 WebControl 類派生的。 因此,Repeater 缺少 DataGrid 和 DataList 二者共有的樣式屬性。 這一點歸結(jié)起來無非是說,如果想對 Repeater 中所顯示數(shù)據(jù)進(jìn)行格式設(shè)置,則必須在 HTML 標(biāo)記中進(jìn)行這樣的操作。 例如,在上面的例子中,如果想用粗體顯示雇員的姓名,則必須更改 ItemTemplate 以包含 HTML 粗體標(biāo)記,就像下面這樣:
<ItemTemplate>
<li><b><%# DataBinder.Eval(Container.DataItem, "EmployeeName")
%></b></li>
</ItemTemplate>
然而對于 DataGrid 或 DataList,通過把控件的 ItemStyle-Font-Bold 屬性設(shè)置為 True,就能用粗體顯示文本了。
Repeater 缺少樣式屬性會大大增加開發(fā)的時間指標(biāo)。 例如,假設(shè)決定使用 Repeater 顯示數(shù)據(jù),這些數(shù)據(jù)需要以粗體、中間對齊且?guī)в刑囟ū尘吧奶囟ㄗ煮w顯示。 所有這些都要用幾個 HTML 標(biāo)記指定,這些標(biāo)記很快就會使 Repeater 的模板變得凌亂不堪。 這種凌亂會使以后對外觀進(jìn)行更改變得困難得多,尤其是當(dāng)其他人對該項目進(jìn)行操作時,則不得不查看大量 HTML 語法。 將這一點與為 DataGrid 或 DataList 指定格式進(jìn)行比較。 對于這兩個控件中的任何一個,都可以通過指定 DataGrid 或 DataList 的樣式屬性來使模板免于凌亂。 此外,可以用一些工具來自動設(shè)置 DataGrid 和 DataList 的樣式屬性,例如 Microsoft Visual Studio .NET 或 ASP.NET Web Matrix。
除了延長開發(fā)時間之外,Repeater 還缺少有助于支持分頁、編輯或數(shù)據(jù)編輯的內(nèi)置功能。 由于缺少這些功能支持,Repeater 在可用性的評定中得分很低。 當(dāng)然,如果 所有您感興趣的只是顯示數(shù)據(jù),而不用帶任何別致的鈴聲或口哨聲,那么 Repeater 的功能匱乏就不是主要缺點了。 我之所以強(qiáng)調(diào)“如果”一詞是因為,通常,Web 應(yīng)用程序一旦進(jìn)行了部署,用戶就會發(fā)現(xiàn)他們需要附加的功能,例如排序、分頁和編輯。
Repeater 有一個彌補(bǔ)性的品質(zhì)(這并不令人吃驚),那就是性能。 Repeater 的性能比 DataList 的性能稍微好一點,比 DataGrid 的性能要好很多。圖 3 顯示了Repeater 每秒能處理的請求數(shù),并與 DataGrid 和 DataList 進(jìn)行了對比。
圖 3: Repeater 的每秒請求數(shù)
返回頁首
小結(jié)
在 ASP.NET Web 頁面中顯示數(shù)據(jù)時,很多開發(fā)人員都選擇他們最熟悉的數(shù)據(jù) Web 控件,通常是 DataGrid。 但是這樣的盲目決定不夠明智,因為根本沒有通用的“最好的”數(shù)據(jù) Web 控件。 決定為給定的 Web 頁使用哪個數(shù)據(jù) Web 控件時,應(yīng)該先就以下各種問題自己考慮一下,以確定哪個控件最適合手邊的任務(wù)。 您想允許用戶對數(shù)據(jù)進(jìn)行排序嗎? 需要把數(shù)據(jù)用非 HTML <table> 的格式顯示嗎? 頁面會被大量訪問嗎,因而性能是一個關(guān)鍵的問題嗎?
因為 DataGrid 能允許最終用戶排序、分頁和編輯它的數(shù)據(jù),所以這三個數(shù)據(jù) Web 控件中 DataGrid Web 控件提供了最好的功能集。 因為使用 DataGrid 時只需要把它添加到 Web 頁面中并寫幾行代碼,所以 DataGrid 也是最簡單易用的數(shù)據(jù) Web 控件。 但是,容易使用和強(qiáng)大的功能是要付出代價的,如性能的代價: DataGrid 是三個數(shù)據(jù) Web 控件中效率最低的,特別是當(dāng)把它放置在 Web 窗體中時。
通過使用模板,DataList 對顯示的數(shù)據(jù)外觀提供了比 DataGrid 更多的控制。 但是,使用模板通常比使用 DataGrid 的列類型需要更多的開發(fā)時間 DataList 還支持?jǐn)?shù)據(jù)的內(nèi)聯(lián)編輯,但是實現(xiàn)起來需要的工作量比 DataGrid 多。 遺憾的是,在 DataList 中提供分頁和排序支持不是一件簡單的事。 DataList 比 DataGrid 提供了更好的性能,從而彌補(bǔ)了這些缺少的內(nèi)置功能。
最后,Repeater 控件允許對呈現(xiàn)的 HTML 標(biāo)記進(jìn)行完整和全面的控制。 對于 Repeater,生成的唯一 HTML 是模板中數(shù)據(jù)綁定語句的值和模板中指定的 HTML 標(biāo)記,而不會生成象 DataGrid 和 DataList 那樣的“額外”HTML。 由于要求開發(fā)人員指定完整生成的 HTML 標(biāo)記,所以通常 Repeater 需要的開發(fā)時間最長。 而且,Repeater 不提供內(nèi)置編輯、排序或分頁支持。 但是,Repeater 的性能確實是這三個數(shù)據(jù) Web 控件中最好的。 它的性能可與 DataList 相比,但明顯比 DataGrid 好。
祝大家編程愉快!
AspNet技術(shù):決定何時使用 DataGrid、DataList 或 Repeater(ASP.NET 技術(shù)文章),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。