当前位置:编程学习 > C#/ASP.NET >>

关于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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,