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这个鸟东西.
...全文
849 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaodeming2010 2011-04-25
  • 打赏
  • 举报
回复
页面会会发,所有对象会重新产生,所以你还的重新绑定数据
L_zero1520 2007-12-06
  • 打赏
  • 举报
回复

不好意思。让(23楼的zwwlovezy1)不快了!
说实话,我没看你的写的代码。
我说太乱是看到楼主的 Page_Init方法里有N多东东才这样说的
所以你不用不快!
jieqimin2008 2007-12-03
  • 打赏
  • 举报
回复
继续关注!
浪漫幕末 2007-12-01
  • 打赏
  • 举报
回复
这个问题可能是由于add和insert方法不同所带来的绑定丢失吧.就此结帖~
谢谢大家~
zwwlovezy1 2007-11-29
  • 打赏
  • 举报
回复
其实解决问题的办法可能有很多种,我们只是碰巧一样罢了,好了不说这个了。
不管会不会消失,如果是追加进来的控件,最好还是要在GridView1_RowDataBound()事件中从新绑定一下 比较安全,因为毕竟是咱们手动加进来的
ken_flash 2007-11-29
  • 打赏
  • 举报
回复
手动加的列,是在每次生成GV的PAGE时用你的函数生成的。
自动生成的列包括模板列要在DataBind后生成。调试的时候能看到这个过程。在<%%>中可以加个断点
浪漫幕末 2007-11-29
  • 打赏
  • 举报
回复
可是消失的是不是后来加的列,而是原本就存在的固定的模板列阿~奇怪啊~
浪漫幕末 2007-11-28
  • 打赏
  • 举报
回复
谢谢各位的发言~
浪漫幕末 2007-11-28
  • 打赏
  • 举报
回复
这些都是我以前做过的例子,并不是像你说的,把你的代码贴过来,17楼写的代码是以前我朋友出这个问题时我帮他做的。
因为你是动态添加的绑定列,所以页面刷新时,控件自然会消失,这个没有什么奇怪的,因为页面加载的时候要从新读取一遍你本身的gridview,而你本身的gv控件上本没有那个绑定列,所以自然会消失,就要从新用绑定方法在页面加载时从新绑定一下!
还有你说动态添加模板列,我给的你是两个方法,第一个是实现ITemplate接口(你有没有仔细看?),第二个是我自己随便做的例子,我只是看到你的问题,才会把这些以前我做的动态绑定的例子都给你,以后肯定用的上,没想21楼的说我写的代码乱(你真懂还是假懂?),楼主还说我是把你代码沾过来了,哎...
CSDN上我解决了那么多人的问题,我有必要沾过谁的代码吗,不会就是不会,没什么丢人的,我把我会的东西都告诉你了,难道没有感谢,还要责备和怀疑?
------------------------
我没有说你是贴我的代码阿,你误解我的意思了吧.我只是说你的那个思路和我在7楼贴出来的是一样的,也就是说,用的同一个办法解决的这个问题.很感谢你的发言,从你给的第一个例子理解了模板列的一些东西.
此外,你可能没看明白我的问题所在,我说的模版列消失,消失的模板列不是动态添加的,你看我在1楼贴出来的代码,在前台页面就加了那个模板列(里面放了一个checkbox控件),我用add()方法把动态加的列追加在最后的话,不出现任何问题,但是用insert()方法把列插入的话,点分页后,checkbox控件就都没有了,但是那个模板列的表头还在,也就是模板列本身还在,就是模板列里面的控件都消失了.
lookatliu 2007-11-27
  • 打赏
  • 举报
回复
ls的兄弟不用那么生气吧,我看了你2个方法觉得确实学到不少东西。但是第2个只能叫动态添加控件吧
zwwlovezy1 2007-11-27
  • 打赏
  • 举报
回复
答完请揭贴 谢谢!
zwwlovezy1 2007-11-27
  • 打赏
  • 举报
回复
这些都是我以前做过的例子,并不是像你说的,把你的代码贴过来,17楼写的代码是以前我朋友出这个问题时我帮他做的。
因为你是动态添加的绑定列,所以页面刷新时,控件自然会消失,这个没有什么奇怪的,因为页面加载的时候要从新读取一遍你本身的gridview,而你本身的gv控件上本没有那个绑定列,所以自然会消失,就要从新用绑定方法在页面加载时从新绑定一下!
还有你说动态添加模板列,我给的你是两个方法,第一个是实现ITemplate接口(你有没有仔细看?),第二个是我自己随便做的例子,我只是看到你的问题,才会把这些以前我做的动态绑定的例子都给你,以后肯定用的上,没想21楼的说我写的代码乱(你真懂还是假懂?),楼主还说我是把你代码沾过来了,哎...
CSDN上我解决了那么多人的问题,我有必要沾过谁的代码吗,不会就是不会,没什么丢人的,我把我会的东西都告诉你了,难道没有感谢,还要责备和怀疑?
SaintKaKa 2007-11-26
  • 打赏
  • 举报
回复
UP
honey52570 2007-11-26
  • 打赏
  • 举报
回复
看样子我不太适合技术,不喜欢研究,只要求能做出来就好的那种...
浪漫幕末 2007-11-26
  • 打赏
  • 举报
回复
代码贴的太多了,大家都不愿意看,哎~
浪漫幕末 2007-11-26
  • 打赏
  • 举报
回复
补充一个方法
public static GridView dynamicGenerateColumns(GridView gv, DataTable dt)
{
// 把GridView的自动产生列设置为false,否则会出现重复列
gv.AutoGenerateColumns = false;

// 清空所有的Columns
//gv.Columns.Clear();

// 遍历DataTable 的每个Columns,然后添加到GridView中去
foreach (DataColumn item in dt.Columns)
{
BoundField col = new BoundField();
col.HeaderText = item.ColumnName;
col.DataField = item.ColumnName;
col.Visible = true;
gv.Columns.Add(col);
}
return gv;
}
这个是解决gridview自动添加列的问题.
浪漫幕末 2007-11-26
  • 打赏
  • 举报
回复
我比较喜欢研究技术,谁可以说明为什么会出现这样的问题,固定的模板列为什么会消失?(只有模板内容消失),动态添加的列都不消失.而且只是在用insert方法添加列才出问题,用add()方法一切正常.

难道是insert()方法重构gridview列的时候造成了模板列数据丢失?
qq22345111 2007-11-26
  • 打赏
  • 举报
回复
翻页后动态的添加状态就丢失了
浪漫幕末 2007-11-26
  • 打赏
  • 举报
回复
我找到一种不很好的办法了,将那个固定的模板列里面的 <asp:CheckBox ID="CheckBox1" runat="server" />
去掉,然后在
protected void GvSelectResult_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
CheckBox cb = new CheckBox();
cb.ID = "CheckBox1";
e.Row.Cells[0].Controls.Add(cb);
e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#CEE3F8'");
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'");
}
}
这个事件里面人工添加checkbox控件,这样控件就不会消失了.

浪漫幕末 2007-11-26
  • 打赏
  • 举报
回复
回复楼上的,我消失的模板列不是动态添加的,是固定的.而且只有内容消失,表头不消失~
加载更多回复(14)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧