小議ASP.NET數(shù)據(jù)Web控件之間的異同
ASP.NET數(shù)據(jù)Web控件也就是DataGrid、DataList和Repeater。研究差異之前首先要了解相似性。從較高級(jí)別觀點(diǎn)來(lái)看,最基本的相似性是,DataGrid、DataList 和 Repeater都設(shè)計(jì)為了執(zhí)行大致相同的操作: 顯示數(shù)據(jù)。 另一個(gè)相似性把數(shù)據(jù)綁定到數(shù)據(jù) Web 控件所需的代碼。 具體地說(shuō),只需要下面兩行代碼:
- dataWebControlID.DataSource = someDataSource
- dataWebControlID.DataBind()
通常,賦給ASP.NET數(shù)據(jù)Web控件的
DataSource
屬性的
someDataSource
對(duì)象是一個(gè) DataSet、SqlDataReader、OleDbDataReader 或一個(gè)集合(如 Array、ArrayList 或
System.Collections
命名空間中的其他某個(gè)類)。 但是,任何實(shí)現(xiàn) IEnumerable 接口的對(duì)象都可以綁定到數(shù)據(jù) Web 控件。
DataBind()
方法枚舉指定的
DataSource
中的記錄。 對(duì)于
DataSource
中的每一條記錄,都會(huì)創(chuàng)建一個(gè)項(xiàng)并追加到數(shù)據(jù) Web 控件的
Items
集合中。 數(shù)據(jù) Web 控件中的每一項(xiàng)都是一個(gè)類實(shí)例。 用于控件每一項(xiàng)的特定類取決于該數(shù)據(jù) Web 控件。 例如,DataGrid 中的每一項(xiàng)都是
DataGridItem
類的一個(gè)實(shí)例,而 Repeater 中的每一項(xiàng)都是
RepeaterItem
類的一個(gè)實(shí)例。
每個(gè)數(shù)據(jù) Web 控件會(huì)為它的每一項(xiàng)使用不同的類,因?yàn)槭沁@些項(xiàng)呈現(xiàn)的方式?jīng)Q定了數(shù)據(jù) Web 控件生成的 HTML 標(biāo)記。 例如,DataGridItem 類是從
TableRow
類中派生的,這意味著每個(gè)
DataGridItem
都或多或少地呈現(xiàn)為一個(gè)表行。 這很有意義,因?yàn)?DataGrid 設(shè)計(jì)為在 HTML
< table>
標(biāo)記內(nèi)以表格形式顯示數(shù)據(jù),在 HTML
< table>
中,每一項(xiàng)都呈現(xiàn)為單獨(dú)一行。 另一方面,Repeater 設(shè)計(jì)為允許對(duì)它的輸出進(jìn)行完全自定義。 因此,RepeaterItem 類不從
TableRow
類中派生并不令人驚訝。
ASP.NET數(shù)據(jù)Web控件之間的另一個(gè)相似性是每個(gè)控件都能使用模板提供高度自定義的輸出。 DataList 和 Repeater 控件必須 使用模板指定它們的內(nèi)容,而 DataGrid 則通過(guò) TemplateColumn 列類型可以為特定的列選擇使用模板(我們將在下一節(jié)“研究 DataGrid Web 控件”中討論各種不同的 DataGrid 列類型)。
最后一個(gè)值得注意的是 DataGrid 和 DataList 控件是從
WebControl
類中派生的,而 Repeater 控件是從
Control
類中派生的。
WebControl
類包含許多美學(xué)方面的屬性,例如
BackColor
、
ForeColor
、
CssClass
、
BorderStyle
等。 這意味著如果使用 DataGrid 和 DataList,就可以通過(guò)它們從
WebControl
類中繼承的屬性指定樣式設(shè)置。 而 Repeater 沒有任何這樣的樣式屬性。
ASP.NET數(shù)據(jù)Web控件的區(qū)別與選擇
在 ASP.NET Web 頁(yè)面中顯示數(shù)據(jù)時(shí),很多開發(fā)人員都選擇他們最熟悉的數(shù)據(jù) Web 控件,通常是 DataGrid。 但是這樣的盲目決定不夠明智,因?yàn)楦緵]有通用的“最好的”數(shù)據(jù) Web 控件。 決定為給定的 Web 頁(yè)使用哪個(gè)數(shù)據(jù) Web 控件時(shí),應(yīng)該先就以下各種問(wèn)題自己考慮一下,以確定哪個(gè)控件最適合手邊的任務(wù)。 您想允許用戶對(duì)數(shù)據(jù)進(jìn)行排序嗎? 需要把數(shù)據(jù)用非 HTML
< table>
的格式顯示嗎? 頁(yè)面會(huì)被大量訪問(wèn)嗎,因而性能是一個(gè)關(guān)鍵的問(wèn)題嗎?
因?yàn)?DataGrid 能允許最終用戶排序、分頁(yè)和編輯它的數(shù)據(jù),所以這三個(gè)數(shù)據(jù) Web 控件中 DataGrid Web 控件提供了最好的功能集。 因?yàn)槭褂?DataGrid 時(shí)只需要把它添加到 Web 頁(yè)面中并寫幾行代碼,所以 DataGrid 也是最簡(jiǎn)單易用的數(shù)據(jù) Web 控件。 但是,容易使用和強(qiáng)大的功能是要付出代價(jià)的,如性能的代價(jià): DataGrid 是三個(gè)數(shù)據(jù) Web 控件中效率最低的,特別是當(dāng)把它放置在 Web 窗體中時(shí)。
通過(guò)使用模板,DataList 對(duì)顯示的數(shù)據(jù)外觀提供了比 DataGrid 更多的控制。 但是,使用模板通常比使用 DataGrid 的列類型需要更多的開發(fā)時(shí)間 DataList 還支持?jǐn)?shù)據(jù)的內(nèi)聯(lián)編輯,但是實(shí)現(xiàn)起來(lái)需要的工作量比 DataGrid 多。 遺憾的是,在 DataList 中提供分頁(yè)和排序支持不是一件簡(jiǎn)單的事。 DataList 比 DataGrid 提供了更好的性能,從而彌補(bǔ)了這些缺少的內(nèi)置功能。
最后,Repeater 控件允許對(duì)呈現(xiàn)的 HTML 標(biāo)記進(jìn)行完整和全面的控制。 對(duì)于 Repeater,生成的唯一 HTML 是模板中數(shù)據(jù)綁定語(yǔ)句的值和模板中指定的 HTML 標(biāo)記,而不會(huì)生成象 DataGrid 和 DataList 那樣的“額外”HTML。 由于要求開發(fā)人員指定完整生成的 HTML 標(biāo)記,所以通常 Repeater 需要的開發(fā)時(shí)間最長(zhǎng)。 而且,Repeater 不提供內(nèi)置編輯、排序或分頁(yè)支持。 但是,Repeater 的性能確實(shí)是這三個(gè)數(shù)據(jù) Web 控件中最好的。 它的性能可與 DataList 相比,但明顯比 DataGrid 好。
【編輯推薦】