CSDN博客

img TomMax

去除Asp:DataGrid中无用ViewState的方法(1)

发表于2004/1/26 1:33:00  1575人阅读

去除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控件的测试页)的ViewState60k之多。而这样一个网页放到公共Web网站,缓慢的网页下载速度将会使大部分人望而却步,使用56k猫上网的人就更不要提了,根本无法访问这样的网页,等待的时间将不可忍受。

   所以大部分有Asp.Net开发经验的开发者,如果不使用DataGrid的高级功能的话,一般是把EnableViewState="False"属性给加入的,还有就是使用自己的分页控件,不使用DataGrid提供的分页功能,这将取消DataGridViewState,大大减少最终生成的Html的代码量。

 

二、DataGrid中必须使用ViewState的一些功能

   不错,很多情况下我们仅需要DataGrid的显示列表数据的功能,或者使用自己的分页功能,这种情况下可以使用EnableViewState="False"属性,但是如果我们需要使用DataGrid的动态编辑、按钮列,或者要访问DataGrid的索引项时,我们必须把DataGridViewState打开,这将不可避免的出现ViewState数据量过大的现象,但是我们没有办法。

   我大略统计了一下DataGrid中需要使用ViewState的一些功能属性,它们都必须使用ViewState,而这些属性我们很多情况下都必须使用:

DataGrid.CurrentPageIndex                     DataGrid分页的页索引

DataGrid.DataKeys                             取每个记录的键值

DataGrid.EditItemIndex                        编辑项的索引

DataGrid.Items                                DataGrid中行的集合

DataGrid.PageCount                            DataGrid分页的总页数

 

而在使用DataGrid内置事件时,传递事件参数的DataGridItemEventArgsDataGridCommandEventArgsDataGridSortCommandEventArgsDataGridPageChangedEventArgs类更加要使用DataGridViewState,否则它们将无法工作。

   这里我给一个简单的示例,在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”属性,那么上面的代码根本无法起作用。

0 0

相关博文

我的热门文章

img
取 消
img