• 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添加到最后,勉强能顶住。

  • 相关阅读:
    centos7安装pycharm
    centos7 mysql数据库安装
    删除MySQL服务
    计组第三章预习
    攻防世界web新手练习区
    原码补码预习
    第一次总结
    第三章预习
    数据结构十进制数表示
    预习原码补码
  • 原文地址:https://www.cnblogs.com/EasonJim/p/4756368.html
Copyright © 2020-2023  润新知