DataGrid Web控件運作機制探秘
DataGrid Web控件是三個ASP.NET數據Web控件中功能最多的。正如前文所述,DataGrid Web控件從WebControl類中誕生,因此可以指定自己想要的樣式。但是在自定義控件生成的實際 HTML 標記時,它又是最不靈活的。 呈現的 HTML 標記中的這種不靈活性,是由于 DataGrid 是設計用于使用 HTML< table>以表格形式顯示數據所造成的。 因此,對于每一條綁定到 DataGrid 的記錄,都會創建一個單獨的表行( < tr>),對于要顯示的記錄中的每一個字段,都會創建一個單獨的表列( < td>)。
DataGrid Web控件提供了許多功能,可極大地提高要顯示的數據的可用性。 例如,把 DataGrid 的AllowSorting屬性設置為 True 并添加一點源代碼,開發人員就可以把一個普通的 DataGrid 變成一個其數據可以由最終用戶排序的 DataGrid。 另外,再增加一點工作量,開發人員就能增強 DataGrid 的功能以允許數據分頁或數據的內聯編輯。 這些功能明顯增強了 DataGrid 的可用性。
除了在可用性方面得分很高,DataGrid 還提供了很短的開發時間。 要使用 DataGrid 開始在 ASP.NET Web 頁面中顯示數據,只需要把 DataGrid 添加到 Web 頁面中并編寫兩行必要的代碼: ***行把數據綁定到 DataGrid 的DataSource,第二行調用 DataGrid 的 DataBind()方法。 顯然,隨著添加到 DataGrid 中的功能數量的增加,開發時間也增加了,但這只是把開發時間和其他數據 Web 控件進行比較。 假設您要允許對 Repeater 顯示的數據進行排序。 添加這樣的功能是一定可能的,但是與用 DataGrid 完成同樣的操作相比,這需要明顯多很多的時間和精力。
盡管 DataGrid 具有良好的可用性和開發時間得分,但是這個控件有兩個固有的缺點。 ***,正如前面所談到的,DataGrid 在對所呈現的 HTML 標記進行自定義方面的功能很有限。 是的,您可以自定義 DataGrid 的不同行和列的字體、顏色和邊框,但是事實仍然是,當 DataGrid 顯示數據時,結果將是一個 HTML< table>, DataSource中的每一條記錄都對應其中一個 < tr>,每一個字段都對應其中一個 < td>。
具體地說,DataGrid 中的每一列都是一個從DataGridColumn類中派生的類實例。 有五個內置的 DataGrid 列類型:
BoundColumn
ButtonColumn
EditColumn
HyperLinkColumn
TemplateColumn
每一個列類型都提供數據或提供某種允許用戶和 DataGrid 進行交互的接口。 例如,BoundColumn 以純文本顯示DataSource字段的值,而 HyperLinkColumn 則會顯示一個超級鏈接,其文字和 URL 部分可能是 DataSource字段。 除了這些內置的列類型,通過創建 DataGridColumn類的派生類,還可以創建自定義 DataGrid 列類型。
有了這么多的 DataGrid 列類型,可能就不理解為什么 DataGrid 呈現的 HTML 標記不能進行高度自定義了。 要知道,雖然每一個 DataGrid 列類型在呈現時生成不同的 HTML,但是每一列都包含在一組< td>標記中,每一行都包含在一組 < tr>標記中。 因此,即使可以用 TemplateColumn 自定義每一行的特定列的 HTML 輸出,而 DataGrid 仍然呈現為 HTML < table>,其中每一行使用一個 < tr>,每一列使用一個 < td>。 DataGrid 的這種限制禁止了更多具有創造性的數據顯示。 例如,如果要在每一表行中顯示五條記錄,就不能使用 DataGrid,必須使用DataList 或 Repeater。 另外,如果要在除 < table>之外的 HTML 標記中顯示數據,很遺憾,就不能使用 DataGrid 了。
DataGrid 第二個缺點是它的性能。 DataGrid 是這三個數據 Web 控件中性能最差的。 基于這一點,由 DataGrid - 特別是具有許多行的 DataGrids - 產生的 ViewState 可能會非常大。 如果使用 DataGrid 僅僅是為了顯示數據,則可以關閉 ViewState,但是,使用 DataGrid 的排序、分頁或編輯功能時,就不能這樣做了。
為了測試 DataGrid 的性能,我使用了 Microsoft 的免費 Web Application Stress Tool (WAST)。 在本文***的“基準設置”一節中列出了精確的測試條件和 WAST 設置。 另外,測試使用的代碼也可在本文***下載。
這個 Web Application Stress Tool 會向 Web 服務器發出一組特定的 URL 請求。 對于每一項測試,我都在一分鐘之內盡可能快地不斷請求一個 URL。 WAST 報告了許多性能衡量標準;我要關注的一個衡量標準是每秒請求數,它表明了 Web 服務器每秒能執行多少次 ASP.NET Web 頁面。
對于一個僅顯示數據的簡單 DataGrid,運行了兩個測試。 具體地說,DataGrid 顯示了來自 Northwinds 數據庫的 Customers 表(Customers 表總共包含 91 條記錄)的四個字段。 DataGrid 的AutoGenerateColumns屬性設置為 True。 ***項測試把 DataGrid 放在一個 Web 窗體( < form runat="server">)中,而第二項測試則沒有。 如果在窗體中放置一個控件而不把它的 EnableViewState屬性顯式設置為 False,那么該控件則會用 ViewState 保持它的狀態。 創建這個 ViewState 項可能是一個比較費時的過程,因此減少了可處理的總的每秒請求數,結果如圖 1 所示。
圖 1: DataGrid 的每秒請求數
應該說,DataGrid Web控件的性能并不是很理想。
【編輯推薦】