Repeater在PostBacks上丢失了它的数据

时间:2011-07-30 23:59:57

标签: c# asp.net webforms

转发器标记:

<asp:Repeater ID="stat_Rptr" runat="server">
                <ItemTemplate>
                    <asp:CheckBox ID="IsSelected_ChkBx" runat="server" Text='<%# Eval("Item") %>' />
                    &nbsp;<asp:TextBox ID="Value_TxtBx" runat="server"></asp:TextBox>
                    <asp:HiddenField ID="ID_HdnFld" runat="server" Value='<%# Eval("ID") %>' />
                </ItemTemplate>
                <SeparatorTemplate>
                    <br></br>
                </SeparatorTemplate>
            </asp:Repeater>

代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PopulateStatRptr();
        }
     }


    private void PopulateStatRptr()
    {
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;

        string _connString = "Data Source=localhost\\SqlExpress;Initial Catalog=MyDb;Integrated Security=True";

        conn = new SqlConnection(ConString);
        comm = new SqlCommand("SELECT ID, Item FROM Stats", conn);

        try
        {
            conn.Open();
            reader = comm.ExecuteReader();
            stat_Rptr.DataSource = reader;
            stat_Rptr.DataBind();
            reader.Close();
        }

        finally
        {
            conn.Close();
        }
    }

3 个答案:

答案 0 :(得分:7)

好的,似乎Repeater是一个动态控件。如果您在代码隐藏中绑定,则必须意识到在您使用DataBind()之前,itemtemplate中的文本框和复选框不存在。如果禁用viewstate,除非在每个页面加载时进行数据绑定,否则不会看到它们。在这种情况下,您将从viewstate获取值。

检查此link

答案 1 :(得分:5)

在Page_Init上绑定而不是Page_Load。

答案 2 :(得分:2)

摆脱if (!IsPostBack)代码,每次都调用你的函数。