去掉DataGrid的ViewState中的无用数据 MyNoName [原作]

转载 2004年07月22日 09:29:00
 

Asp.Net中,我们使用最多的恐怕就是DataGrid列表控件了。这个控件的功能的却非常强大,也非常好用。它不但可以实现任意的格式化选择,而且还可以动态进行分页、排序、添加按钮、动态编辑等功能。可以说,DataGrid控件已经实现了我们需要的大部分功能。

DataGrid控件需要通过ViewState来保存控件的状态的,如果我们关闭了ViewState,即在HTML代码中使用了EnableViewState="False"属性,那么,上面的所有有用的功能我们将无法使用。

ViewState的缺点也是很大的,就是DataGrid会把所有的数据源中的数据存放到ViewState中。我试验了一下,一个包括5000条记录的数据库,如果不在数据库端控制数据量的话,直接使用Select * From TableName这样的Sql语句绑定数据的话,一个Asp.Net动态网页(仅有一个DataGrid控件的测试页)的ViewState60k之多。而这样一个网页放到公共Web网站,缓慢的网页下载速度将会使大部分人望而却步,使用56k猫上网的人就更不要提了,根本无法访问这样的网页,等待的时间将不可忍受。

DataGrid保存在ViewState中的数据分为两个部分,一部分是保存索引用的,就是DataKeysDataItems这样的属性使用的数据,我们把它称之为索引数据。还有一部分是DataGrid中数据源的内容,我们称之为列表数据。

我们如果把实际上无用的列表数据从ViewState中去除,这样可以大大减小页面ViewState的数据大小,使用DataGridViewState数据量太大的根本原因就是列表数据存放在ViewState中。

DataGrid的内部工作流程:在数据绑定初始化的时候,生成了一个叫DataGridTable的控件对象,这个对象是继承System.Web.UI.WebControls.Table控件的。而且这个对象是最先加入(使用Controls.Add()方法)DataGrid中的。而且ViewState中的DataGrid列表数据也是这个控件加入到DataGrid中的。实际上,ViewState中的DataGrid的单元格中的数据实际上是System.Web.UI.WebControls.Table控件的SaveViewState()方法给加进去的。这些数据很多情况下是不需要的。

?

解决方法:在数据绑定的时候,设置DataGridDataGridTable控件的EnableViewState属性为False就可以了。

?

首先在页面初始化中的InitializeComponent()方法内加入事件的委托:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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时,把上面的代码加入,将减小使用DataGridViewState90%的数据量。而且,DataGrid中许多使用ViewState的功能丝毫不少,岂不是两全其美?

?

当然,网页执行第一次时,DataGrid的内容正常显示,而使用了上面的去除ViewState方法后,页面如果回发处理,DataGrid的内容将会消失。我才明白DataGridDataGridTable把数据存放在ViewState内的用意。微软的设计是非常严谨的,他们的用意就是当使用Page.IsPostBack属性时,仅访问一次数据库就可以永久保持DataGrid的数据(在不离开此页面的情况下),数据存放的地点就是页面的ViewState中。这样页面回发后,DataGrid就可以从ViewState中重新生成DataGrid的显示内容,无需访问数据库。所以说微软以牺牲客户下载的速度(ViewState数据量)来保证服务器的资源,大家都知道频繁访问数据库对服务器的资源消耗很大。

所以,使用上面减少DataGridViewState数据的法子是可行的,但是必须使所有的页面回发处理都必须进行数据绑定,否则DataGrid无法获得数据库内容,也无法获得ViewState中保存的数据,那么回发后DataGrid将无法显示任何内容。

?

总结:使用上面减少ViewState的办法可以大大加快客户端的下载显示速度,但是频繁的数据库访问将加大服务器的压力;使用ViewState可以减轻服务器的压力,但是又加大了客户端的下载时间,它们是互相矛盾的。所以开发者要根据实际情况选择是否使用DataGrid.Controls[0].EnableViewState=false;的法子,如何选择,大家请自己斟酌。

去掉DataGrid的ViewState中的无用数据

在Asp.Net中,我们使用最多的恐怕就是DataGrid列表控件了。这个控件的功能的却非常强大,也非常好用。它不但可以实现任意的格式化选择,而且还可以动态进行分页、排序、添加按钮、动态编辑等功能。可...
  • u014739782
  • u014739782
  • 2014年04月25日 09:10
  • 244

去掉DataGrid的ViewState中的无用数据

在Asp.Net中,我们使用最多的恐怕就是DataGrid列表控件了。这个控件的功能的却非常强大,也非常好用。它不但可以实现任意的格式化选择,而且还可以动态进行分页、排序、添加按钮、动态编辑等功能。可...
  • u014739784
  • u014739784
  • 2014年04月25日 09:33
  • 144

android高手之路--删除工程里面无用的代码和资源

如果你是一个经常开发android应用程序或者做android维护项目的人,我想说你对我谈论的这个话题,一定会感兴趣的。 因为只有做到了这两点,你的项目生成的apk包才会更小,而不是随着你的开发...
  • mengweiqi33
  • mengweiqi33
  • 2014年03月31日 10:58
  • 1328

页面ViewState体积庞大影响性能解决方案

我们都知道asp.net 服务器控件状态都是通过ViewState对象存储的,实际上是存储在客户端页面上的隐藏域中,当数据量过大时频繁和服务器传输,严重影响性能。直接想到的办法就是把这些数据储存到别的...
  • taoerchun
  • taoerchun
  • 2015年05月07日 17:15
  • 1096

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

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

EasyUI datagrid border处理,加边框,去边框,都可以

EasyUI datagrid border处理,加边框,去边框,都可以。 EasyUI 官网上处理datagrid border的demo里面已经实现。 当然还可以直接在datagrid定义时采st...
  • luwei19881121
  • luwei19881121
  • 2014年10月09日 17:04
  • 13881

菜鸟教程之工具使用(十一)——Eclipse去掉未使用的引用

大家在写代码的时候经常会看到如下的情况:大家都知道这是因为引入了未使用的包,所以Eclipse给出了提示,告诉你这些是无用的引用,这些无用的引用即影响了美观,又增加了代码占用的空间,还给代码的编译增加...
  • liushuijinger
  • liushuijinger
  • 2015年02月28日 19:23
  • 11807

ViewState的使用与配置

 ViewState就是页面中的名字叫做__VIEWSTATE的隐藏控件,它使我们页面体积膨胀,不利于页面的seo优化;页面返送间都要携带更多的大量的数据,耗费更多的流量、延长响应时间。 ...
  • yygzs2012
  • yygzs2012
  • 2017年04月06日 16:03
  • 372

如何有效的清除Android中无用的资源(静态代码分析)

如何有效的清除Android中无用的资源(静态代码分析) 最近公司要做这个,简单调研了一下,现有的大多数博客也比较旧了,不太合适,总结了这么几个方式吧,一起来学习下。 为什么要清除Androi...
  • it_flower
  • it_flower
  • 2016年08月25日 00:27
  • 3982

EasyUI datagrid border处理,加边框,去边框

EasyUI datagrid border处理,加边框,去边框,都可以,easyuidatagrid 下面是EasyUI 官网上处理datagrid border的demo: 主要是...
  • springflower66
  • springflower66
  • 2016年06月29日 08:09
  • 1560
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 去掉DataGrid的ViewState中的无用数据 MyNoName [原作]
举报原因:
原因补充:

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