DataGrid、DataList或Repeater的一些討論(2)

在三種控件當中,DataGrid是迄今爲止功能最爲豐富的,但也是最不靈活的控件。這種在輸出HTML時不夠靈活的特點是因爲它最初就是被設計成以表格的形式輸出數據。每一條記錄輸出時會建立一對標籤。   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頁面多少次。 在下面我們要討論並測試的DataList和Repeater中,我們會看到它們的性能將優於DataGrid。 [DataList控件]   如前所述,DataGrid使用表格來顯示數據。你也許需要更進一步地控制數據的顯示。例如,你想使數據在表格中顯示,但不是每行只有一條記錄,而是多條。又或者,你並不想使用表格來顯示數據,而是隻將它們顯示在一系列標籤中。   DataList放棄了DataGrid中列表顯示數據的概念,而是使用事先定義好的模板(Template)來定製顯示。通過使用模板,可以同時使用HTML標籤或數據綁定。這裏的數據綁定的形式爲:<%# … %>,用來顯示數據源中給定條目的數據記錄。如下的ItemTemplate將會顯示數據源中CompanyName字段:               <%# DataBinder.Eval(Container.DataItem, "CompanyName") %>          通過修改上面的模板,我們可以使CompanyName字段顯示爲粗體字,而ContactName字段則以正常式樣顯示在CompanyName之下。               <%# DataBinder.Eval(Container.DataItem, "CompanyName") %>       
      <%# DataBinder.Eval(Container.DataItem, "ContactName") %>           對於DataList數據源中的每一條記錄,ItemTemplate會通過定義HTML標籤來以相同的樣式顯示數據。ItemTemplate還支持其它其它6種模板:   ·AlternatingItemTemplate   ·EditItemTemplate   ·FooterTemplate   ·HeaderTemplate   ·ItemTemplate   ·SelectedItemTemplate   ·SeparatorTemplate   默認情況下DataList會將記錄顯示在HTML表格中。然而,通過設定RepeatColumn屬性,你可以設置在一行中顯示多少條記錄。更進一步,你甚至可以指定DatList的內容不顯示在表格中,而是標籤中。這可以通過設定RepearLayout屬性來實現。   通過模板、RepeatColumn和RepeatLayout屬性,很明顯DataList在定製數據輸出樣式方面較DataGrid更具靈活性,使得用戶界面設計可以更加友好。當然,我們還需要進行功能性的對比,如分頁、排序、記錄編輯等等。   通過EditItemIndex模板和EditCommand,UpdateCommand以及CancelCommand事件,DataList將支持記錄編輯的功能。不過,比較DataGrid而言,這需要耗費更多的開發時間來實現。這種開發時間上的不一致主要有兩個原因:   ·編輯/更新/刪除按鈕在DataGrid中可以通過設定EditCommandColumn來自動添加;而在DataList中則需要手動添加。   ·DataGrid的BoundColumn列樣式自動使用文本框控件來顯示記錄編輯界面。而在DataList中,你必須通過EditItemTemplate明確地指定使用什麼樣的編輯界面。   實現DataList中的分頁、排序功能同記錄編輯功能情況一樣,並不算非常複雜。這些功能可以通過巧妙的編程加以實現,只是耗費一些開發時間。所以,如果需要用戶對數據記錄進行排序或編輯的話,使用DataGrid要比使用DataList方便得多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章