简介
本文将告诉您如何减少生成的DataGrid控件的ViewState数据的大小,同时保持像所有的DataGrid的功能,选择项目或传呼。
我假设你知道它是什么和如何使用ViewState。如果没有,请首先对他们的学习,例如阅读文章。在这篇文章中,您还可以找到有关减少ViewState的大小一般信息。背景
当我开始在实践中学习和使用ASP.NET,我的问题之一是ViewState的 - 通常是太大!通常情况下,我可以减少它的大小,通过禁用选定的控件或整个页面。不幸的是,当我禁用VS控制,有时我失去了它的一些功能。这才是真正的为DataGrid - 当你禁用ViewState,你就会失去先进的功能,如选择项目或传呼。在另一边,ViewState中生成的DataGrid的通常是非常大的 - 它与每一个添加的行和列的增长。
在过去两个星期,我决定最后解决这个问题。我以为我的DataTable在ViewState中,我的数据的DataGrid中存储的副本存储的BoundColumn对象列列。后来我发现,这是一个错误的假设。
首先,我显示了用于显示我的网页的控制整个树。第一个惊喜 - DataGrid中使用国内其他控件来显示内容。下面是示例的2x2的DataGrid控件树:DataGrid中DataGridTable的DataGridItemTableCell的TableCell的的DataGridItemTableCell的TableCell的
DataGridTable是从System.Web.UI.WebControls.Table派生类。的DataGridItem对象代表行,TableCell的代表DataGrid的细胞。
接下来,我反编译。NET中使用反射二进制文件[]和我浏览的DataGrid,BaseDataList(其基类)的代码,绑定列,和DataGridColumn类。不幸的是,我没有发现任何可以帮助我解决我的问题。
在这一点上,我决定尝试一下我的ViewState的内容进行解码和分析。我用的ViewState解码器[]。当我显示我的ViewState的数据,其结构看起来对我熟悉。病房后,我发现 - 这是类似的控制我的网页上树!我认为 - 如果我禁用ViewState的DataGrid的每一行?我检查了这一点,... ...尤里卡!这就是它!如何减少DataGrid的ViewState的大小 - 摘要禁用ViewState
如果可以,整体的DataGrid(财产的EnableViewState设置为false),或更好的禁用整个页面的ViewState。如果你需要先进的DataGrid的功能,如选择项目或传呼,你不能使用这种方法。在这种情况下,你应该使用下列方法。禁用列自动生成
财产AutoGenerateColumns设置为false,并手动创建列使用DataGrid控件的属性生成器。当列是自动生成的,关于他们的信息是存储在ViewState中。禁用ViewState为每个DataGrid的行
这是最好的方法,因为显示的数据的副本存储在ViewState中TableCell.Text属性值。当您停用,DataGrid中的ViewState的大小是恒定的,不增加当您显示更多的行。您可以使用此以下代码:private void DisableViewState(DataGrid的DG){
; 的foreach(在dg.Items的DataGridItem DGI) { &
#160; dgi.EnableViewState = FALSE; }}私人无效的Page_Load(对象发件人,发送System.EventArgs){ MyDataGrid.DataSource = getData()方法; MyDataGrid.DataBind(); DisableViewState(MyDataGrid);}String []数组存储在ViewState所需的标识符
当你显示用户数据,你需要显示的数据存储标识符。你可以存储在隐藏DataGrid的列,但是这是不是最佳的 - 你的ID将存储的DataGridItem / TableCell的/串树(你还需要从以前的方法更改代码禁用ViewState只选定列)。更好的办法是String []数组的ID存储在ViewState中。注:INT []数组似乎更合适,但不是:LosFormatter类所产生的数据更紧凑的字符串[]比int []数组的数组。这是由事实LosFormatter类是只为字符串[]数组优化。
例如:你有三个IDS阵列:1,2,3。如果存储在ViewState作为字符串[],你会得到:@ LT; 1; 2; 3; GT;
当你存储为int [],你会得到:@为System.Int32,mscorlib程序,版本= 1.0.5000.0,文化=中立,
0; 公钥= b77a5c561934e089lt; ILT; 1gt; ILT; 2GT; ILT; 3GT; GT;
如果您存储更多的INT []数组在ViewState中,除了头都将被储存如下:@ 50lt; ILT; 1gt; ILT; 2GT; ILT; 3GT; GT;
另外,您可以存储在ArrayList中的ID - 以下是从ArrayList作为字符串存储的值产生的数据,并为int:LLT 1 2 3; GT;LLT; ILT; 1gt; ILT; 2GT; ILT; 3GT; GT;
下面是一个示例代码,创建并存储在ViewState中的数组与IDS的DataTable DT = getData()方法;MyDataGrid.DataSource = DT;MyDataGrid.DataBind();字符串[] IDS =新的字符串[dt.Rows.Count];(N = 0; NLT; dt.Rows.Count,N) IDS [N] = dt.Rows [N] ["idquot;]的ToString();的ViewState ["idsquot;] = IDS;
当你需要显示的数据检索的ID,请使用下面的代码:INT指数= MyDataGrid.SelectedIndex;字符串[] IDS =(字符串[])的ViewState ["idsquot;];myID = Convert.ToInt32(IDS [0]);统计
我创建的页面,显示一个10 * 10的表。每个单元包含一个三位数。下面是我的测试结果:
VS - ViewState中,加利福尼亚 - 列自动生成。说明ViewState的大小VS启用,6032VS启用,禁用5028
VS为行禁用,CA禁用236VS禁用除第一列中的所有细胞,加州禁用948VS禁用行,CA残疾人,为int []的ID存储在VSVS禁用行,CA残疾人,IDS在VS中的String []316VS禁用行,CA存储在ArrayList中的整数的残疾人,在VS IDS356VS禁用行,CA残疾人,在ArrayList中的字符串存储在VS IDS
正如你所看到的ViewState,大小从6032减少到316个字节。我们保存了5716字节,而现在ViewState中只含有5.2%的数据开始!兴趣点
我曾在这近两个星期的文章(禁用ViewState中为每个DataGrid的行)所涵盖的主要方法。这是真的,最简单的解决方案是最难找到的。
我还发现,在ViewState中存储的数据可以优化。这是可以做到的,如果你知道如何LosFormatter工程。另一种方法是实现自己的类,以取代LosFormatter,这是另一篇文章的题目。历史2005年4月11日
第一个版本。