GridView动态添加列之后,导致PostBack(回发)页面数据丢失问题解决
2015-08-25 01:30
691 查看
直入主题,首先声明,这个问题是无法解决的,特此在这说明
一、如何动态添加列,如下:
在页面重写OnInit事件,至于为什么要在这个事件写,根据页面的声明周期和经验可知(不用去别的地方找了,这个我找了之后得到的):
TemplateField tf = new TemplateField();
tf.HeaderText = obj.Name;
tf.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
tf.SortExpression = obj.RankId.ToString();
//this.gridView.Columns.Insert(i, tf);//此方法会导致PostBack数据丢失。原因我估计是只要操作了Columns里面的数组顺序就会有问题,投机取巧的方式在下面会说,也是不行的
this.gridView.Columns.Add(tf);//此方法不会
base.OnInit(e);
以上控件添加好了,绑定数据如下:
在GridView上实现事件RowDataBound,在里面进行动态的数据绑定,大概实现如下:
/*//动态列数据绑定
DataRowView rowDataSource = (DataRowView)e.Row.DataItem;
if (rowDataSource == null)
{
return;
}
int ruleId = (int)rowDataSource["RuleId"];
int ruleMode = (int)rowDataSource["RuleMode"];
for (int i = 2; i <= _rankCount; i++)
{
e.Row.Cells[i].Text = (int)rowDataSource["RuleId"];
}
到此,动态添加列和绑定数据基本是完成了。
二、投机取巧的实现方式,也是失败的,思路如下
1、先把GridView的所有Columns添加到一个临时数据。
2、把要添加的动态列往这里面的指定位置加。
3、然后把GridView的所有Columns清除。
4、再把临时数组里面的Columns添加回去GridView中。
以上实现也是不行的,所以不要用这种方式尝试了,问题出现在第三步,动了GridView的Columns。
三、问题的发现,基本是找了老外的网站看到的说明:
http://stackoverflow.com/questions/3919991/gridview-columns-insert-cause-my-data-to-vanish-on-postback-but-columns-add?answertab=active#tab-top http://codeverge.com/asp.net.presentation-controls/gridview.columns.insert-problem/473635
这两篇文章里面说了,是微软的一个bug,而且是在09年就有了,也说了,人家微软也不打算修复了。
所以,这东西我花了两天去找方法觉得,最终是无法实现的,特此在此说明一下。如果你不在乎动态列的位置,那就直接用add添加到最后,勉强能顶住。
一、如何动态添加列,如下:
在页面重写OnInit事件,至于为什么要在这个事件写,根据页面的声明周期和经验可知(不用去别的地方找了,这个我找了之后得到的):
TemplateField tf = new TemplateField();
tf.HeaderText = obj.Name;
tf.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
tf.SortExpression = obj.RankId.ToString();
//this.gridView.Columns.Insert(i, tf);//此方法会导致PostBack数据丢失。原因我估计是只要操作了Columns里面的数组顺序就会有问题,投机取巧的方式在下面会说,也是不行的
this.gridView.Columns.Add(tf);//此方法不会
base.OnInit(e);
以上控件添加好了,绑定数据如下:
在GridView上实现事件RowDataBound,在里面进行动态的数据绑定,大概实现如下:
/*//动态列数据绑定
DataRowView rowDataSource = (DataRowView)e.Row.DataItem;
if (rowDataSource == null)
{
return;
}
int ruleId = (int)rowDataSource["RuleId"];
int ruleMode = (int)rowDataSource["RuleMode"];
for (int i = 2; i <= _rankCount; i++)
{
e.Row.Cells[i].Text = (int)rowDataSource["RuleId"];
}
到此,动态添加列和绑定数据基本是完成了。
二、投机取巧的实现方式,也是失败的,思路如下
1、先把GridView的所有Columns添加到一个临时数据。
2、把要添加的动态列往这里面的指定位置加。
3、然后把GridView的所有Columns清除。
4、再把临时数组里面的Columns添加回去GridView中。
以上实现也是不行的,所以不要用这种方式尝试了,问题出现在第三步,动了GridView的Columns。
三、问题的发现,基本是找了老外的网站看到的说明:
http://stackoverflow.com/questions/3919991/gridview-columns-insert-cause-my-data-to-vanish-on-postback-but-columns-add?answertab=active#tab-top http://codeverge.com/asp.net.presentation-controls/gridview.columns.insert-problem/473635
这两篇文章里面说了,是微软的一个bug,而且是在09年就有了,也说了,人家微软也不打算修复了。
所以,这东西我花了两天去找方法觉得,最终是无法实现的,特此在此说明一下。如果你不在乎动态列的位置,那就直接用add添加到最后,勉强能顶住。
相关文章推荐
- UISearchbar 搜索按钮更换 代码实现UISearchbar去除第一响应
- Attribute "scope" must be declared for element type "bean"
- git版本控制器
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- BZOJ 3931 网络吞吐量 (最短路+最大流)
- hdu 4366 Successor (线段树xdfs序x排序预处理)
- eclipse新建maven web项目流程
- 浅谈单片机程序设计中的“分层思想”
- SSH整合配置文件值web.xml
- 自旋锁和互斥锁区别
- 双向链表
- linux下epoll如何实现高效处理百万句柄的
- 数据库三种范式的理解
- gcc 多次调用scanf %c时,"\n"引发的程序异常
- [ZOJ 3646]Matrix Transformer[二分图匹配]
- UVA 11346 Probability (几何概型, 积分)
- SVN服务器搭建和使用(三)
- SVN服务器搭建和使用(二)
- C语言编写控制台下PE分析工具(一)
- DFS解马走日问题