去掉DataGrid的ViewState中的無用資料

來源:互聯網
上載者:User
datagrid|資料 在Asp.Net中,我們使用最多的恐怕就是DataGrid清單控制項了。這個控制項的功能的卻非常強大,也非常好用。它不但可以實現任意的格式化選擇,而且還可以動態進行分頁、排序、添加按鈕、動態編輯等功能。可以說,DataGrid控制項已經實現了我們需要的大部分功能。

DataGrid控制項需要通過ViewState來儲存控制項的狀態的,如果我們關閉了ViewState,即在HTML代碼中使用了EnableViewState="False"屬性,那麼,上面的所有有用的功能我們將無法使用。

而ViewState的缺點也是很大的,就是DataGrid會把所有的資料來源中的資料存放到ViewState中。我實驗了一下,一個包括5000條記錄的資料庫,如果不在資料庫端控制資料量的話,直接使用Select * From TableName這樣的Sql語句綁定資料的話,一個Asp.Net動態網頁(僅有一個DataGrid控制項的測試頁)的ViewState有60k之多。而這樣一個網頁放到公用Web網站,緩慢的網頁下載速度將會使大部分人望而卻步,使用56k貓上網的人就更不要提了,根本無法訪問這樣的網頁,等待的時間將不可忍受。

DataGrid儲存在ViewState中的資料分為兩個部分,一部分是儲存索引用的,就是DataKeys和DataItems這樣的屬性使用的資料,我們把它稱之為索引資料。還有一部分是DataGrid中資料來源的內容,我們稱之為列表資料。

我們如果把實際上無用的列表資料從ViewState中去除,這樣可以大大減小頁面ViewState的資料大小,使用DataGrid時ViewState資料量太大的根本原因就是列表資料存放在ViewState中。

DataGrid的內部工作流程:在資料繫結初始化的時候,產生了一個叫DataGridTable的控制項對象,這個對象是繼承System.Web.UI.WebControls.Table控制項的。而且這個對象是最先加入(使用Controls.Add()方法)DataGrid中的。而且ViewState中的DataGrid列表資料也是這個控制項加入到DataGrid中的。實際上,ViewState中的DataGrid的儲存格中的資料實際上是System.Web.UI.WebControls.Table控制項的SaveViewState()方法給加進去的。這些資料很多情況下是不需要的。

?

解決方案:在資料繫結的時候,設定DataGrid中DataGridTable控制項的EnableViewState屬性為False就可以了。

?

首先在頁面初始化中的InitializeComponent()方法內加入事件的委託:

private void InitializeComponent()

{

??? this.myDataGrid.ItemDataBound +=

new DataGridItemEventHandler(this.myDataGrid_ItemDataBound);

}

然後在myDataGrid_ItemDataBound方法內加入控制碼:

private void myDataGrid_ItemDataBound(object sender, DataGridItemEventArgs e)

{

??? myDataGrid.Controls[0].EnableViewState = false;

}

使用DataGrid時,把上面的代碼加入,將減小使用DataGrid時ViewState的90%的資料量。而且,DataGrid中許多使用ViewState的功能絲毫不少,豈不是兩全其美?

?

當然,網頁執行第一次時,DataGrid的內容正常顯示,而使用了上面的去除ViewState方法後,頁面如果回傳處理,DataGrid的內容將會消失。我才明白DataGrid內DataGridTable把資料存放在ViewState內的用意。微軟的設計是非常嚴謹的,他們的用意就是當使用Page.IsPostBack屬性時,僅訪問一次資料庫就可以永久保持DataGrid的資料(在不離開此頁面的情況下),資料存放的地點就是頁面的ViewState中。這樣頁面回傳後,DataGrid就可以從ViewState中重建DataGrid的顯示內容,無需訪問資料庫。所以說微軟以犧牲客戶下載的速度(ViewState資料量)來保證伺服器的資源,大家都知道頻繁訪問資料庫對伺服器的資源消耗很大。

所以,使用上面減少DataGrid的ViewState資料的法子是可行的,但是必須使所有的頁面回傳處理都必須進行資料繫結,否則DataGrid無法獲得資料庫內容,也無法獲得ViewState中儲存的資料,那麼回傳後DataGrid將無法顯示任何內容。

?

總結:使用上面減少ViewState的辦法可以大大加快用戶端的下載顯示速度,但是頻繁的資料庫訪問將加大伺服器的壓力;使用ViewState可以減輕伺服器的壓力,但是又加大了用戶端的下載時間,它們是互相矛盾的。所以開發人員要根據實際情況選擇是否使用DataGrid.Controls[0].EnableViewState=false;的法子,如何選擇,大家請自己斟酌。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。