GridView动态添加列之后,导致PostBack(回发)页面数据丢失问题解决

直入主题,首先声明,这个问题是无法解决的,特此在这说明

一、如何动态添加列,如下:

在页面重写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添加到最后,勉强能顶住。

 

posted @ 2015-08-25 01:30  EasonJim  阅读(1493)  评论(2编辑  收藏  举报