返回首页

简介
本文将告诉您如何减少生成的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日
第一个版本。

回答

评论会员:sumans4324 时间:2011/12/04
非常感谢..我的页面中包含大量的数据只有一个电网。在我的网页,其做工精细..但我不明白为什么你写了一个额外的功能禁用视图状态,并把它称为每次的DataBind发生...如果我们在相同的网格的ItemDataBound事件会造成任何问题吗?? ?对于我的网页我已经检查其做工精细..
评论会员:bhat1234 时间:2011/12/04
!喜
在这里,
我在UpdatePanel中使用的GridView / DataList的(说)来显示搜索结果的记录(如超链接,点击它显示在另一页的记录细节)形式的SQL服务器数据库,它工作正常。现在,当我回来的页面与GV / DL的,我不能看到数据。
我知道,我已经使用"视图状态",任何人都可以给我正确的和完整的视图状态实现ANSD任何其他的提示
T.Q!愉快的一天.. {S0} {S0}
评论会员:游客 时间:2011/12/04
froman118:我没有因为无论是说,上回我的数据丢失,所以whats这样一个DataGrid使用
cupo
评论会员:游客 时间:2011/12/04
你有重新绑定的在每次回发的数据,所以你必须决定是否额外触及到数据库或其他数据源您使用的是价值减少的视图状态的大小是。
丹尼尔Fruzynski
评论会员:游客 时间:2011/12/04
这可能是很好的解决方案,如果你有你的页面上只有一个DataGrid的,但一旦你添加另一个Datagrid的一切都搞砸了,除非你从服务器的数据再次。我试着用传呼机和两个DataGrid,这是行不通的!
cupo
评论会员:游客 时间:2011/12/04
这是正常现象,因为DataGrid中不显示的数据的副本存储在它的DataView。每次回发后,您必须重新电网的DataBind():codeprelang=csspanclass="code-keyword"private/spanspanclass="code-keyword"void/spanShowGrid1(spanclass="code-keyword"int/spannPage){DataGrid1.CurrentPageIndex=nPage;DataGrid1.DataSource=GetData1();DataGrid1.DataBind();DisableViewState(DataGrid1);} spanclass="code-keyword"private/spanspanclass="code-keyword"void/spanShowGrid2(spanclass="code-keyword"int/spannPage){DataGrid2.CurrentPageIndex=nPage;DataGrid2.DataSource=GetData2();DataGrid2.DataBind();DisableViewState(DataGrid2);} spanclass="code-keyword"private/spanspanclass="code-keyword"void/spanDataGrid1_PageIndexChanged(spanclass="code-keyword"object/spansource,System.Web.UI.WebControls.DataGridPageChangedEventArgse){ShowGrid1(e.NewPageIndex);ShowGrid2(DataGrid2.CurrentPageIndex);} spanclass="code-keyword"private/spanspanclass="code-keyword"void/spanDataGrid2_PageIndexChanged(spanclass="code-keyword"object/spansource,System.Web.UI.WebControls.DataGridPageChangedEventArgse){ShowGrid1(DataGrid1.CurrentPageIndex);ShowGrid2(e.NewPageIndex);}/pre/code
丹尼尔Fruzynski
评论会员:游客 时间:2011/12/04
我知道,但效率不高。想象一下,有两个分页DataGrid中启用和每个每页显示25条记录,约200页!现在,当你点击第一个DataGrid下一页,第二个会失去它的所有数据,除非你再次绑定它。同样,效率​​不高,有超过一个DataGrid。
cupo
评论会员:游客 时间:2011/12/04
尝试使用以下解决方案:-从隐藏字段中的ViewState数据移动到其他地方,如会议。看看这里:imgsrc=http://www.orcode.com/upimg/2011_12_04_13_20_20_0.gif-在DataGrid中启用CustomPaging和检索数据库({A}])只需要行。您也可以存储在会话然后复制,并回发后使用。丹尼尔-在13点36日(星期四)十月十三日,2005年修改
丹尼尔Fruzynski
评论会员:游客 时间:2011/12/04
使用这种数据会议效率不高,完全是无稽之谈。为什么我会超载,而不是客户端的服务器?
barani_76
评论会员:游客 时间:2011/12/04
如果你想超负荷客户端而不是服务器...所有我可以建议你的是,提供自定义SavePageStateToPersistenceMedium/LoadPageStateFromPersistenceMedium功能(寻找链接到我的上一个职位),并压缩到客户端的ViewStatesended。您还可以使用自定义LosFormatter类,更有效的方式(LosFormatter数据存储为纯文本,发送到客户端之前base64编码)存储数据。丹尼尔
Abishek Bellamkonda
评论会员:游客 时间:2011/12/04
您好,是的,这是一个伟大的文章。我有一个问题在我applicaton。在我的网页的DataGrid中有10行。每个代表一个数据库表,包含空文本框和下拉列表(查找值与相应的数据库字段的值填充在这些网格数下拉菜单,项目数少只,但其他下拉菜单的值可能以千计)。像这样,我已经约7格代表tabase空的文本框和人口下拉菜单表,正如我刚才所说。此查询屏幕方便的搜索功能。用户在文本框的标准,或选择下拉值。页面根据用户输入的标准,应建立SQL动态和fethch结果,并在另一个结果grid.It填充客户的要求这极大地增加了视图状态为4MB的大小,这是一个很大的性能问题。由于我在页面加载所有加载下拉列表,所有的网格增加了视图状态的内容很大,导致性能问题。我已启用视图状态所有与电网,因为我需要采摘在所有的电网建设动态SQL输入或选择的价值是什么。他们DataGrid中已知的问题,导致大量视图状态的足迹,因为containg大数据量的下拉菜单,ViewState是在每个回的巨大规模和其导致的性能问题。如何降低的ViewState内容和提高我的要求的性能。任何想法!我检查了谷歌,几篇文章说,在服务器side.But保存视图状态存储在服务器中的会话变量的ViewState的大型内容也将有服务表现问题。但是,这将更好地把在页面本身的ViewState的内容和回那巨大的内容,观看时thro看房。你能告诉我最好的方式去提前。我已经完成了具有完整功能的查询的屏幕。任何建议表示欢迎。感谢问候巴拉尼
Abishek Bellamkonda
评论会员:游客 时间:2011/12/04
:-DGreat文章AbiBaby(AbishekBellamkonda)=(:*{BR}
Xagyg
评论会员:游客 时间:2011/12/04
"大文章"hahahahah。我觉得有趣,因为文章("A","本","")从这个提交可疑的缺席。Ahhhh。有趣的。
Abishek Bellamkonda
评论会员:游客 时间:2011/12/04
。如果这是一个英语测试,笔者有可能失败,或得到较少的标记,如果你assesedFortunatly技术文章,你只需要基本的英语。=(:*{BR}
Sathish库马尔K
评论会员:游客 时间:2011/12/04
,不幸的是,太多的人与你同意这个概念如果你证明你不能正确和有效地使用任何语言,你表示出一种普遍的趋势,在您使用其他语言的如下......无论是人类或计算机为基础的。对于许多人来说,有人用英语马虎的知名度,使他们能够推断同样缺乏护理,比方说,使用。NET语言,而不是分析代码来了同样的结论。
罗伯特V
评论会员:游客 时间:2011/12/04
,但它是无用的,如果被禁用的DataGridItem的VS。不会总干事使用绑定数据源的其他控制postbacked页面时,总干事将显示我们没有任何包含的数据行表。
Sathish库马尔K
评论会员:游客 时间:2011/12/04
那么,将会有几乎所有的东西都好,不会有这么好的东西。其高达读者看到半满还是半空。我一直在寻找数字带来了ViewState和你otherside条件的这个人。我个人的ViewState存储在服务器(数据库),我在会议或文件系统使用它的代码。它工作得很好,至今看到过没有问题。会议是快,但占用服务器内存很快。每个请求获取一个GUID是作为隐藏变量存储。其所有在我的BasePage。我禁用ViewState,或根据情况启用控制/页。AbiBaby(AbishekBellamkonda)=(:*=(:*{BR}
spvarapu
评论会员:游客 时间:2011/12/04
?嗨,如何不同的是这种方法减少对每一个项目的视图状态NBSPLT;ASP:DataGrid的ID="DataGrid1中"RUNAT="服务器"的EnableViewState="假"的BorderStyle="无"边框宽度="1px的"的BorderColor="#CCCCCC"-;的BackColor=CellPadding"白"="10"即我们也可以禁用视图状态在一步跨越DataGrid中是你的方法降低了视图状态Sathish库马尔K{BR}