最近写一个页面,发现一个问题,在 GridView 中间插入一列,注意是插入,而不是添加,不管插入的列是什么列,当PostBack回来时,就会出现该列前面的所有模板列都不见了,大家遇到过这种情况吗?有什么好办法?我现在只能用 BoundField 列来显示了。示例代码:
        if (!IsPostBack)
        {
            BoundField b = new BoundField();
            GridView1.Columns.Insert(5, b); //Insert 会出现这种情况,Add 就没问题。
            GridView1.DataSource = CreateDataSource();
            GridView1.DataBind();
        }
        else
        {
            GridView1.DataSource = CreateDataSource();
            GridView1.DataBind();
            //这时候,前面4列中所有的模板列都什么也显示不出来了。
        }查了很久,也没有找到解决办法,谁能告诉我怎么解决?

解决方案 »

  1.   

    你的代码需要放在
    protected void Page_Init( object sender, EventArgs e )
    {}里面,而不是
    protected void Page_Load( object sender, EventArgs e )
    {}
    才不会出现你说的问题
      

  2.   

    另外还必须设置 EnableViewState="false" ,否则,表头变化了,下面的数据会错位
      

  3.   

    谢谢 net_lover 的回复,我这样做了,还是有问题:
    如果把 Page_Load 中的代码放在 Page_Init 中,在 PostBack 回来的时候,GridView 虽然做了绑定,但数据窗什么也显示不出来了,但放在 Page_Load 中就很正常。
    不管 EnableViewState="false" 是否设置,都是这样的结果。
      

  4.   

    哦,上面的回复,我有一个错误,就是在 Page_Init 中页面的控件的值是空,导致数据窗没有显示出来,我再测试一下。
      

  5.   

    在 Page_Init 中写数据窗的代码,有一些问题,因为这时候页面的所有控件的值都没法取到:
    用户在页面的其它控件上输入了值,进入 Page_Init 时还没法得到这些值,数据窗内容的查询条件没法获得。在 Page_Load 中做上面的操作,基本上都没有问题,唯一的问题就是当 Insert 数据窗的列的时候出现了问题,我觉得这是 GridView 的一个 BUG,如果没其它办法的话,还有一个办法,就是全部使用 Add 来添加列,避免使用 Insert。
      

  6.   

    放在Page_Load也是可以的,下面是完整源代码,你可以试试<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="Default20.aspx.cs"
      Inherits="Default20" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title>无标题页</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
          <Columns>
            <asp:TemplateField HeaderText="模板列姓名">
              <ItemTemplate>
                <%#Eval("学生姓名")%>
              </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="模板列年级">
              <ItemTemplate>
                <%#Eval("学生班级")%>
              </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="语文" HeaderText="语文" SortExpression="语文" />
            <asp:TemplateField HeaderText="模板列计算机">
              <ItemTemplate>
                <%#Eval("计算机")%>
              </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="数学" HeaderText="数学" SortExpression="数学" />
          </Columns>
        </asp:GridView>
        <asp:TextBox ID="TextBox1" runat="server">控件的值</asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
      </form>
    </body>
    </html>using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;public partial class Default20 : System.Web.UI.Page
    {
      protected void Page_Load( object sender, EventArgs e )
      {
        if (!IsPostBack)
        {
          BoundField b = new BoundField();
          b.HeaderText = "代码添加的列";
          b.DataField = "学生姓名";
          b.ItemStyle.ForeColor = System.Drawing.Color.Red;
          GridView1.Columns.Insert(3, b); //Insert 会出现这种情况,Add 就没问题。
          GridView1.DataSource = CreateDataSourceByXianhuiMeng();
          GridView1.DataBind();
        }
        else
        { 
          GridView1.DataSource = CreateDataSourceByXianhuiMeng();
          GridView1.DataBind();
        }  }
      // 计算数据,完全可以从数据看取得
      ICollection CreateDataSourceByXianhuiMeng( )
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));    for (int i = 0 ; i < 8 ; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = "班级" + i.ToString() + TextBox1.Text;
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    }
      

  7.   

    经测试
    EnableViewState="false"
    一定不能设置为true
      

  8.   

    很好,现在可以了,EnableViewState="false" 设置后,每次进入 Page_Load 后不管是否 PostBack都重新添加必要的列,一切就都可以了。