最近写一个页面,发现一个问题,在 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列中所有的模板列都什么也显示不出来了。
}查了很久,也没有找到解决办法,谁能告诉我怎么解决?
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列中所有的模板列都什么也显示不出来了。
}查了很久,也没有找到解决办法,谁能告诉我怎么解决?
protected void Page_Init( object sender, EventArgs e )
{}里面,而不是
protected void Page_Load( object sender, EventArgs e )
{}
才不会出现你说的问题
如果把 Page_Load 中的代码放在 Page_Init 中,在 PostBack 回来的时候,GridView 虽然做了绑定,但数据窗什么也显示不出来了,但放在 Page_Load 中就很正常。
不管 EnableViewState="false" 是否设置,都是这样的结果。
用户在页面的其它控件上输入了值,进入 Page_Init 时还没法得到这些值,数据窗内容的查询条件没法获得。在 Page_Load 中做上面的操作,基本上都没有问题,唯一的问题就是当 Insert 数据窗的列的时候出现了问题,我觉得这是 GridView 的一个 BUG,如果没其它办法的话,还有一个办法,就是全部使用 Add 来添加列,避免使用 Insert。
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;
}
}
EnableViewState="false"
一定不能设置为true