直入主题,首先声明,这个问题是无法解决的,特此在这说明
一、如何动态添加列,如下:
在页面重写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添加到最后,勉强能顶住。