zoukankan      html  css  js  c++  java
  • 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添加到最后,勉强能顶住。

  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/EasonJim/p/4756368.html
Copyright © 2011-2022 走看看