GridView 中动态插入一列,导致 GridView 中该列前面的模板列出错
最近写一个页面,发现一个问题,在 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列中所有的模板列都什么也显示不出来了。
}
查了很久,也没有找到解决办法,谁能告诉我怎么解决?
[解决办法]
放在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;
}
}