首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
btbtd (83)
coofucoo (107)
longrujun (64)
cyz1980 (101)
ssll2826 (10)
EmilMatthew (73)
goodboy1881 (15)
superlmj (12)
feng19821209 (9)
yjz0065 (115)
CSDN - 文档中心 - .NET 阅读:5307   评论: 2    参与评论
标题   去除Asp:DataGrid中无用ViewState的方法(1)     选择自 TomMax 的 Blog
关键字   .Net,Asp.Net,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控件的测试页)的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”属性,那么上面的代码根本无法起作用。


相关文章
对该文的评论
meteorshine ( 2004-02-21)
是啊, 我看了半天, 到头来只是说明现象,
怎么解决啊?
ZXYSOSO ( 2004-01-27)
既然知道了它的危害性,就应该提出解决方案,超,没意思