C# 手动绑定中继器中的行,以避免丢失viewstate数据

C# 手动绑定中继器中的行,以避免丢失viewstate数据,c#,asp.net,postback,repeater,viewstate,C#,Asp.net,Postback,Repeater,Viewstate,我正在使用一个转发器来显示自定义控件的列表,每个控件包含两个下拉列表 单击添加控件按钮,页面将在中继器上添加新行,单击每个控件中嵌入的删除控件按钮之一,将从中继器中删除相关控件 删除部分似乎可以工作(将NamingController.Visible设置为false),但添加部分失败,因为一旦我添加了新控件,对新的repeater.DataBind()的调用将丢失所有viewstate数据,从而阻止DropDownList检索回发之前的值 有没有一种方法可以在不调用完整数据绑定的情况下手动将添加

我正在使用一个转发器来显示自定义控件的列表,每个控件包含两个下拉列表

单击
添加控件
按钮,页面将在中继器上添加新行,单击每个控件中嵌入的
删除控件
按钮之一,将从中继器中删除相关控件

删除部分似乎可以工作(将
NamingController.Visible
设置为
false
),但添加部分失败,因为一旦我添加了新控件,对新的
repeater.DataBind()的调用将丢失所有viewstate数据,从而阻止DropDownList检索回发之前的值

有没有一种方法可以在不调用完整数据绑定的情况下手动将添加的控件绑定到中继器?或者有没有其他方法可以在不丢失数据的情况下添加控件

以下是一些代码(我只留下了似乎相关的内容,如果您认为我忘记指定某些内容,请告诉我):

Page.aspx:


我以前也做过类似的事情,发现c-sharp corner的链接很有用。

如果内存服务器使用ViewState对象并相应地绑定,那么这是我的关键元素

myObject=ViewState[“MyData”];等等


(很抱歉,我目前无法访问我的代码)

由于视图状态,您正在丢失数据。 视图状态在重定向到另一页时丢失数据。 视图状态仅存储特定页面的数据。 当您转到另一页时,视图状态会丢失数据。 &由于多种原因,同一页上的数据很可能会丢失。 因此,存储数据的最佳方法是使用会话变量。 即使您正在重定向到另一个页面,会话也会存储数据。 这是存储数据的最佳方式

默认情况下,它将数据存储20分钟


我希望这能解决您的问题。

您不必在SessionState中存储任何内容。我要做的是从中继器中取出值,绑定中继器,然后重新插入值。这一切都可以在同一个函数中完成,因此您不会存储任何内容。但这是额外的工作。
<asp:Button ID="addControl" runat="server" Text="Add control" />
<asp:Repeater ID="repeater" runat="server" OnItemDataBound="repeater_ItemDataBound">
    <ItemTemplate>
        <uc:CustomControlWithDropDownLists ID="custom" runat="server" />
    </ItemTemplate>
</asp:Repeater>
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    repeater.DataSource = GetDataSource();
    repeater.DataBind();
}

protected void Page_Init(object sender, EventArgs e)
{
    addControl.Click += (sndr, args) =>
    {
        // Create the object we want to bind to the repeater
        ObjectToBind objectToBind = new ObjectToBind();

        // Here is what causes data loss
        ((IList<ObjectToBind>)repeater.DataSource).Add(objectToBind);
        repeater.DataBind();
    };
}

protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        // Do some stuff
    }
}
protected void Page_Init(object sender, EventArgs e)
{
    deleteControl.Click += (sndr, args) =>
    {
        // ... Delete the control ...

        ((Button)sndr).NamingContainer.Visible = false;
    };
}