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

转载 2004年07月01日 09:33:00
CSDN - 文档中心 - .NET    
标题     去除Asp:DataGrid中无用ViewState的方法(2)    TomMax(原作)
关键字     .Net,Asp.Net,DataGrid,ViewState

三、去掉ViewStateDataGrid无用数据<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   终于说到正题了,我这篇文章说的就是怎样去掉ViewState中的无用数据,而保留有用的数据。文章写到这里,我们可以很明显的看出来,DataGrid保存在ViewState中的数据分为两个部分,一部分是保存索引用的,就是DataKeysDataItems这样的属性使用的数据,我们把它称之为索引数据。还有一部分是DataGrid中数据源的内容,我们称之为列表数据。

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

  我在微软的.Net Framework SDK文档中没有找到关闭列表数据ViewState的任何内容,就是说微软没有给出DataGrid运行时的任何调用顺序和内部的工作机制。没办法,我使用了一个工具来获得DataGrid的内部工作流程,发现它在数据绑定初始化的时候,生成了一个叫DataGridTable的控件对象,这个对象是继承System.Web.UI.WebControls.Table控件的。而且这个对象是最先加入(使用Controls.Add()方法)DataGrid中的。而且ViewState中的DataGrid列表数据也是这个控件加入到DataGrid中的。实际上,ViewState中的DataGrid的单元格中的数据实际上是System.Web.UI.WebControls.Table控件的SaveViewState()方法给加进去的。这些数据很多情况下是不需要的。

   好,原因找到了,解决问题就好办了,因为微软已经给出了控制DataGrid中子控件的方法。我们既然知道DataGridTable控件是DataGrid中最先生成的控件,那么我们通过DataGrid.Controls属性就可以直接获取DataGrid中子控件的引用,获得引用后就可以控制子控件了。解决方法就是在数据绑定的时候,设置DataGridDataGridTable控件的EnableViewState属性为False就可以了。

代码如下:

首先必须重写DataGrid.ItemDataBoundDataGrid.ItemCreated事件,我们用它们来控制在向客户端写html之前DataGrid的动作。这两个事件任选其一,都可以实现效果。我们使用ItemDataBound事件来写例子,DataGrid示例IDmyDataGrid

[C#]

首先在页面初始化中的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;

}

 

[VB.Net]

Private Sub myDataGrid_ItemDataBound(sender As Object,e As DataGridItemEventArgs) _

Handles myDataGrid.ItemDataBound

 

    myDataGrid.Contols.Item(0).EnableViewState = False

 

End Sub

 

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

 

注意:

1.上面说的法子有一种情况下不能使用,就是使用DataGrid的内部分页功能时,重写DataGrid.PageIndexChanged事件时,调用DataGridPageChangedEventArgs时,必须把所有的ViewState打开,包括列表数据,关闭任何的ViewState,都将导致DataGridPageChangedEventArgs的索引丢失,无法分页。

不过这个缺点很好解决,很多人已经写了自定义的分页控件,这些控件是不需要DataGrid的任何数据的。可以提供非常完美的分页功能。

2. (重要)我春节的这几天对上面说的办法进行了详细的测试,发现上面的办法确实有效,可以大大的减少aspx页面的ViewState的数据量,但是这个办法在使用上有一个注意的地方,否则会出现数据无法显示的毛病。

我一直在奇怪,微软写DataGrid为什么要加入一个DataGridTable类,而且还要把所有的数据库数据存放在ViewState中。经过测试我才发现,这是因为有了System.Web.UI.Page.IsPostBack属性的缘故。我们经常喜欢利用Page.IsPostBack属性检测页面是否是第一次运行,如下代码:

private void Page_Load(object sender, System.EventArgs e)

{

    if(!Page.IsPostBack)

    {

       // 页面第一次运行,执行数据绑定

       SqlConnection conn = new SqlConnection(“...”);

       SqlCommand comm = new SqlCommand(“...”,conn);

       ...

       ...

       myDataGrid.DataBind() // 数据绑定

    }

}

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

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

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

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

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

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

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

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

去除DataGrid中无用的ViewState数据的方法 一、             DataGrid控件中的ViewState   在Asp.Net中,我们使用最多的恐怕就是DataGrid列表控...
  • TomMax
  • TomMax
  • 2004年01月26日 01:33
  • 1594

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

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

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

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

ASP.NET中的viewstate使用

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

去掉ViewState中DataGrid的无用数据

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

android 混淆和去除无用资源

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

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

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

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

最近项目赶得紧,常常拿以前的项目的stylecss移植过来(公司项目速度要求),这样子,其实重用项目代码没什么不好,但是多出很多无用的CSS样式,作为一名前端开发者迷,当然要想出办法怎么清除多余没有用...
  • timtimup123321
  • timtimup123321
  • 2015年09月24日 16:54
  • 602
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:去除Asp:DataGrid中无用ViewState的方法(2)
举报原因:
原因补充:

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