關于何種情況下使用DataGrid、DataList或Repeater的一些討論(2)
2024-07-21 02:16:30
供稿:網友
 
[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。