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

原创 2004年01月26日 01:33:00
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

去除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”属性,那么上面的代码根本无法起作用。

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

 三、去掉ViewState中DataGrid的无用数据   终于说到正题了,我这篇文章说的就是怎样去掉ViewState中的无用数据,而保留有用的数据。文章写到这里,我们可以很明显的看出来,Data...
  • xwqjamky
  • xwqjamky
  • 2005年10月14日 09:30
  • 408

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

三、去掉ViewState中DataGrid的无用数据   终于说到正题了,我这篇文章说的就是怎样去掉ViewState中的无用数据,而保留有用的数据。文章写到这里,我们可以很明显的看出来,DataG...
  • TomMax
  • TomMax
  • 2004年01月27日 21:06
  • 1548

去除DataGrid中无用的ViewState数据的方法

 去除DataGrid中无用的ViewState数据的方法 一、             DataGrid控件中的ViewState   在Asp.Net中,我们使用最多的恐怕就是DataGrid列表...
  • jacky_163
  • jacky_163
  • 2010年01月05日 16:23
  • 310

去除DataGrid中无用的ViewState数据的方法[段]

DataGrid控件通过ViewState来保存控件的状态的DataGrid会把所有的数据源中的数据存放到ViewState中。DataGrid是一个列表控件,它存放在ViewState中的数据包括了...
  • sharpcn
  • sharpcn
  • 2004年09月26日 12:08
  • 757

ASP.NET中的viewstate使用

.net 中viewstate的原理和使用 如果在客户端和服务器段保持往返的状态,在.net中通过加入一个隐藏控件_ViewState来实现的,这些状态的保持不需要程序员来控制,节省了程序员的精力。但...
  • greyls
  • greyls
  • 2007年07月08日 10:54
  • 6176

去掉ViewState中DataGrid的无用数据

、去掉ViewState中DataGrid的无用数据   终于说到正题了,我这篇文章说的就是怎样去掉ViewState中的无用数据,而保留有用的数据。文章写到这里,我们可以很明显的看出来,DataGr...
  • jacky_163
  • jacky_163
  • 2010年01月05日 16:19
  • 329

android 混淆和去除无用资源

利用gradle去除无效资源文件与混淆
  • qq_27688259
  • qq_27688259
  • 2016年11月09日 11:19
  • 592

去掉.java的无用、多余引用的快捷键

Ctrl+shift+O
  • qwdafedv
  • qwdafedv
  • 2016年12月06日 14:53
  • 1046

无用的css样式怎么去清除?

最近项目赶得紧,常常拿以前的项目的stylecss移植过来(公司项目速度要求),这样子,其实重用项目代码没什么不好,但是多出很多无用的CSS样式,作为一名前端开发者迷,当然要想出办法怎么清除多余没有用...
  • timtimup123321
  • timtimup123321
  • 2015年09月24日 16:54
  • 600

ViewState EnableViewState 禁用与使用心得

每个web控件都有个ViewState值,如果一个页面有太多的web控件而不禁用他们的viewstate值的话,会让页面速度大大降低。那么哪些控件的 EnableViewState="false...
  • hr541659660
  • hr541659660
  • 2015年11月11日 16:41
  • 2464
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:去除Asp:DataGrid中无用ViewState的方法(1)
举报原因:
原因补充:

(最多只允许输入30个字)