GridView 中模板列莫名其妙消失
浪漫幕末 2007-11-26 09:29:31 问题描述:Gridvie控件有一个固定的模板列,其它列都是动态添加的,包括ButtonField列.当我加载数据的时候,一切正常,但是当点击GridView中翻页后,模板列消失了,模板列的表头还在,就是内容消失了.其它列都没有问题.
代码如下:
<asp:GridView ID="GvSelectResult" PageSize="20" runat="server" AllowPaging="True" Width="1500"
BackColor="White" BorderColor="#A6CBEF" BorderStyle="Solid" BorderWidth="1px"
OnPageIndexChanging="GvSelectResult_PageIndexChanging" AutoGenerateColumns="False" OnRowCommand="GvSelectResult_RowCommand" OnRowDataBound="GvSelectResult_RowDataBound" OnRowCreated="GvSelectResult_RowCreated">
<Columns>
<asp:TemplateField HeaderText="<input id='Checkbox1' type='checkbox' onclick='selectAll(this)' />" >
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
public void addButtonField(string headText, string text, string cmdName)
{
ButtonField bf = new ButtonField();
bf.HeaderText = headText;
bf.Text = text;
bf.CommandName = cmdName;
GvSelectResult.Columns.Insert(0,bf);
}
public void addHyperLinkField(string headText, string text,
string[] DataNavigateUrlFields, string DataNavigateUrlFormatString, string Target)
{
HyperLinkField hlf = new HyperLinkField();
hlf.HeaderText = headText;
hlf.Text = text;
hlf.Target = Target;
hlf.DataNavigateUrlFields = DataNavigateUrlFields;
hlf.DataNavigateUrlFormatString = DataNavigateUrlFormatString;
GvSelectResult.Columns.Insert(0,hlf);
}
protected void Page_Init(object sender, EventArgs e)
{
DataSet reportKey, GvDataSet;
reportKey = new DataSet();
GvDataSet = new DataSet();
if (!String.IsNullOrEmpty(bbid))
{
reportKey = DbOperateClass.DbOperate.GetDataSet("select tablename,zdm,zwhy from zdybb where bbid='"
+ bbid + "' and yxbz='1' order by zdxssx");
string tableName;
DataTableReader dtr = new DataTableReader(reportKey.Tables[0]);
DataTableReader dtr1 = new DataTableReader(reportKey.Tables[0]);
DataTableReader dtr2 = new DataTableReader(reportKey.Tables[0]);
StringBuilder sb = new StringBuilder("select ");
try
{
dtr1.Read();
tableName = dtr1.GetString(0);
while (dtr.Read())
{
sb.Append(dtr.GetString(1));
sb.Append(",");
}
}
finally
{
dtr1.Close();
dtr.Close();
}
sb.Length = sb.Length - 1;
sb.Append(" from ");
sb.Append(tableName);
ViewState["selectSql"] = sb.ToString();//保存查询命令
GvDataSet = DbOperateClass.DbOperate.GetDataSet(sb.ToString());
GvDataSet.Tables[0].TableName = tableName;
string[] colName = new string[GvDataSet.Tables[0].Columns.Count];
for (int i = 0; dtr2.Read();i++ )//给数据源加上中文列名
{
GvDataSet.Tables[0].Columns[i].Caption = dtr2.GetString(2);
colName[i] = GvDataSet.Tables[0].Columns[i].ColumnName;
}
this.DataTableKeys = colName;//获取字段的名字
}
Ds = GvDataSet;//设置控件的数据源
if (GvDataSet.Tables[0].Rows.Count > 0)
{
if (gvPageSize != 0)
{
GvSelectResult.PageSize = gvPageSize;//根据属性设置GridView的分页数据
}
if (dataKey.Length > 0)
{
GvSelectResult.DataKeyNames = new string[] { dataKey };//设置GridView的主键
}
if (!Page.ClientScript.IsClientScriptIncludeRegistered(this.GetType(), "checkAll"))
{
Page.ClientScript.RegisterClientScriptInclude("checkAll", Page.ResolveClientUrl("~/script/GridView.js"));
}
if (!Page.IsPostBack)
{
DbOperateClass.DbOperate.dynamicGenerateColumns(GvSelectResult, ds.Tables[0]);
for (int p = 0; p < ds.Tables[0].Columns.Count; p++)//给gv命名列名称
{
GvSelectResult.Columns[p + 1].HeaderText = ds.Tables[0].Columns[p].Caption;
//GvSelectResult.HeaderRow.Cells[p].Text = ds.Tables[0].Columns[p].Caption;
}
addCheckBoxCol();
//LabTableName.Text = ds.Tables[0].TableName;
for (int p = 0; p <= ds.Tables[0].Columns.Count; p++)
{
if (p == ds.Tables[0].Columns.Count)
{
R1C1.Items.Insert(0, new ListItem("", ""));
break;
}
ListItem li = new ListItem(ds.Tables[0].Columns[p].Caption, ds.Tables[0].Columns[p].ColumnName);
R1C1.Items.Add(li);
}
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (ds.Tables[0].Rows.Count>0)
{
GridViewDataBind(GvSelectResult, ds); //执行数据绑定
}
}
}
上面我贴出了动态添加列的方法,和page_load,page_Init,页面东西比较多我就贴出这么多,需要的话我再贴.最后一点,我动态添加列的话,如果是用的 add()方法,而不是用insert()方法的话,不会出现任何问题,使用insert()方法指定动态添加列的位置后,就出现了,翻页后,模板列内容消失的问题.
在baidu上搜索了好久,也没有找到答案,包括在社区里面.大家在baidu搜索这个问题的帮助时,注意一下病毒,有一个页面有利用realplay漏洞的病毒,我的机器中招了,删除不干净,就是usrinit.exe这个鸟东西.