去除DataGrid中无用ViewState的步骤
去除DataGrid中无用的ViewState数据的方法
一、 DataGrid控件中的ViewState
在Asp.Net中,我们使用最多的恐怕就是DataGrid列表控件了。这个控件的功能的却非常强大,也非常好用。它不但可以实现任意的格式化选择,而且还可以动态进行分页、排序、添加按钮、动态编辑等功能。可以说,DataGrid控件已经实现了我们需要的大部分功能。
遗憾的是,上面说的很多非常实用的功能,大部分需要ViewState的支持,就是说DataGrid控件需要通过ViewState来保存控件的状态的,如果我们关闭了ViewState,即在HTML代码中使用了EnableViewState="False"属性,那么,上面的所有有用的功能我们将无法使用。
而ViewState的缺点也是很大的,就是DataGrid会把所有的数据源中的数据存放到ViewState中。DataGrid是一个列表控件,它存放在ViewState中的数据包括了列表中所有单元格(Cell)中的数据,更加可恨的是,即时我们打开了分页功能,它也要把所有的没有显示出的数据源中的数据放到ViewState里面,如果不在数据库端控制数据量大小的话,DataGrid控件实际上是把数据库表中所有数据统统都存放在ViewState中。直接后果就是Asp.Net生成发送到客户端的源Html代码异常庞大。
大家知道,Asp.Net中,ViewState实际上是一个名称/值对的字典,为了正确在各种编码的网页中保存,将ViewState序列化后又进行了Base64编码。这将更加加大ViewState的数据量。
我试验了一下,一个包括5000条记录的数据库,如果不在数据库端控制数据量的话,直接使用Select * From TableName这样的Sql语句绑定数据的话,一个Asp.Net动态网页(仅有一个DataGrid控件的测试页)的ViewState有60k之多。而这样一个网页放到公共Web网站,缓慢的网页下载速度将会使大部分人望而却步,使用56k猫上网的人就更不要提了,根本无法访问这样的网页,等待的时间将不可忍受。
所以大部分有Asp.Net开发经验的开发者,如果不使用DataGrid的高级功能的话,一般是把EnableViewState="False"属性给加入的,还有就是使用自己的分页控件,不使用DataGrid提供的分页功能,这将取消DataGrid的ViewState,大大减少最终生成的Html的代码量。
二、DataGrid中必须使用ViewState的一些功能
不错,很多情况下我们仅需要DataGrid的显示列表数据的功能,或者使用自己的分页功能,这种情况下可以使用EnableViewState="False"属性,但是如果我们需要使用DataGrid的动态编辑、按钮列,或者要访问DataGrid的索引项时,我们必须把DataGrid的ViewState打开,这将不可避免的出现ViewState数据量过大的现象,但是我们没有办法。
我大略统计了一下DataGrid中需要使用ViewState的一些功能属性,它们都必须使用ViewState,而这些属性我们很多情况下都必须使用:
DataGrid.CurrentPageIndex DataGrid分页的页索引
DataGrid.DataKeys 取每个记录的键值
DataGrid.EditItemIndex 编辑项的索引
DataGrid.Items DataGrid中行的集合
DataGrid.PageCount DataGrid分页的总页数
而在使用DataGrid内置事件时,传递事件参数的DataGridItemEventArgs、DataGridCommandEventArgs、DataGridSortCommandEventArgs、DataGridPageChangedEventArgs类更加要使用DataGrid的ViewState,否则它们将无法工作。
这里我给一个简单的示例,在DataGrid中加入一个CheckBox列,这使当页面回发的时候我可以获取DataGrid的键值。但是如果关闭ViewState的话,此功能无法使用。
Html:
<Asp:DataGrid ID=”myDataGrid” Runat=”Server” DataKeyField=”ID” AutoGenerateColumns=”False”>
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<Asp:CheckBox ID=”myBox” Runat=”Server” />
</ ItemTemplate>
</ asp:TemplateColumn>
</Columns>
</Asp:DataGrid>
<br /><br />
<Asp:Button ID=”bntSubmit” Runat=”Server” Text=”OK” />
Code:
private void btnSubmit_Click(object sender, System.EventArgs e)
{
CheckBox cb;
string str;
for(int i=0;i<myDataGrid.tems.Count;i++)
{
cb = (CheckBox)myDataGrid.Items[i].Cells[2].FindControl("myBox");
if(cb.Checked)
str += myDataGrid.DataKeys[myDataGrid.Items[i].ItemIndex].ToString();
}
// 此时str变量就是DataGrid中选中行的数据库键值。
}
上面的代码使用很成功,不过如果在DataGrid中使用了EnableViewState=”False”属性,那么上面的代码根本无法起作用。
本文地址:http://www.45fan.com/dnjc/70297.html