关于gridview动态创建模板列刷新后丢失控件问题
我在后台动态创建了一个模板列,在里面放了个checkbox,但在刷新后item项里的checkbox全都丢失了。请问有什么办法解决呢?谢谢了 --------------------编程问答-------------------- 确切地说,也不叫丢失。你在页面设计上写死的,在页面装载的时候(init事件之前)每一次都给你整个重新创建一遍。你觉得是页面维持了控件,可人家实际只是每一次重建新的实例。因此,所有动态的东西都应该重建,否则你肯定得不到post值、事件等。 --------------------编程问答-------------------- 学习. --------------------编程问答-------------------- 有什么办法可以解决啊 --------------------编程问答-------------------- 给你写个例子,包括两个文件:defaule.aspx和UcGridView.ascx:
第一个文件:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Control uc = this.LoadControl("~/ucGridView.ascx");
uc.ID = "BusinessUI";
this.PlaceHolder1.Controls.Add(uc);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:Button ID="Button1" runat="server" Text="什么也不做,检查控件状态保持能力" />
</form>
</body>
</html>
第二个文件:
<%@ Control Language="C#" ClassName="UcGridView" %>
<%@ Import Namespace ="System.Data" %>
<script runat="server">
private DataTable ds
{
get
{
DataTable ret = new DataTable();
ret.Columns.Add("name", typeof(string));
DataRow dr;
dr = ret.NewRow(); dr[0] = "张三"; ret.Rows.Add(dr);
dr = ret.NewRow(); dr[0] = "皇帝"; ret.Rows.Add(dr);
dr = ret.NewRow(); dr[0] = "王五"; ret.Rows.Add(dr);
dr = ret.NewRow(); dr[0] = "马超"; ret.Rows.Add(dr);
dr = ret.NewRow(); dr[0] = "关羽"; ret.Rows.Add(dr);
return ret;
}
}
protected void Page_Load(object sender, EventArgs e)
{
myTemplate aa = new myTemplate();
TemplateField tf = new TemplateField();
tf.ItemTemplate = aa;
this.GridView1.Columns.Add(tf);
this.GridView1.DataSource = ds;
this.DataBind();
}
private class myTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
CheckBox ck = new CheckBox();
ck.ID = "temp";
container.Controls.Add(ck);
ck.Text = "动态模板";
}
}
</script>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="name" HeaderText="姓名" />
<asp:TemplateField HeaderText="写死的模板">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
点击那个测试按钮,你可以看到不论是在设计时写死的模板还是动态创建的模板,都正确处理和post值。我没有写事件,但是既然post值正确了,事件也就不会有什么差。
在defaule.aspx中我在代码写死了永远使用同一个ascx,实际可以根据情况装入不同的ascx。你可以把这个ascx用我 http://community.csdn.net/Expert/topic/5328/5328527.xml?temp=.5083734 中写的那个 aspx 页面测试一下。 --------------------编程问答-------------------- 第二个方法我一直在用,但问题就是如果不加!IsPostBack,他就会在每次刷新后创建一个。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 每次回传页面后都动态生成一次 --------------------编程问答-------------------- 第二个方法我一直在用,但问题就是如果不加!IsPostBack,他就会在每次刷新后创建一个。
----------------
先clear再加
补充:.NET技术 , ASP.NET