C# Viewstate加载动态控件时出现问题(使用ListBox)

C# Viewstate加载动态控件时出现问题(使用ListBox),c#,asp.net,viewstate,C#,Asp.net,Viewstate,这是我的第一个问题,如果我做错了什么,我道歉。 我也是Asp.net的新手。我的问题是: 我有一个“添加控件按钮”,它只添加了一个预配置列表框的用户控件。(想法是根据用户需要添加尽可能多的用户控件。)到目前为止还不错。当我在列表框中标记一个元素时,选择在第一次回发后丢失(例如在单击“添加控件”按钮后)。不知道,这似乎是一个生命周期问题。我的错误解决方案(根据我在网上的发现进行了调整)如下:我使用一个列表来恢复每个用户控件的ID。谢谢。代码如下: 受保护列表控件列表 { 得到 { if(ViewS

这是我的第一个问题,如果我做错了什么,我道歉。 我也是Asp.net的新手。我的问题是:

我有一个“添加控件按钮”,它只添加了一个预配置列表框的用户控件。(想法是根据用户需要添加尽可能多的用户控件。)到目前为止还不错。当我在列表框中标记一个元素时,选择在第一次回发后丢失(例如在单击“添加控件”按钮后)。不知道,这似乎是一个生命周期问题。我的错误解决方案(根据我在网上的发现进行了调整)如下:我使用一个列表来恢复每个用户控件的ID。谢谢。代码如下:

受保护列表控件列表
{
得到
{
if(ViewState[“控件”]==null)
{
ViewState[“控件”]=新列表();
}
返回(列表)视图状态[“控件”];
}
}
//基于ControlsList中的ID还原控件
受保护的覆盖无效LoadViewState(对象保存状态)
{
base.LoadViewState(savedState);
foreach(ControlsList中的字符串contrID)
{ 
对照组c;
c=负载控制(“v1.ascx”);
c、 ID=“v1-”+contrID;
占位符1.控件。添加(c);
}
//单击按钮可添加控件
受保护的void addControl(对象发送方、事件参数)
{
对照组c;
c=负载控制(“v1.ascx”);
c、 ID=“v1-”+NextID.ToString();
控件列表添加(c.ID);
占位符1.控件。添加(c);
}
此处显示用户控件:

public partial class v1 : System.Web.UI.UserControl
{
protected void Page_Init(object sender, EventArgs e)
{
    v1_ListBox1.DataSourceID = "A1Vm1_SqlDataSource";
    v1_ListBox1.DataTextField = "Vm1";
    v1_ListBox1.DataValueField = "Vm1";
    v1_ListBox1.SelectionMode = ListSelectionMode.Multiple;

}

您应该更改ViewState的保存方式

protected override object SaveViewState()
{
    var a = this.ControlsList;
    var b = base.SaveViewState();
    if (a.Count == 0 && b == null)
        return null;

    return new System.Web.UI.Pair(a, b);
}

protected override void LoadViewState(object savedState)
{
    if (savedState == null)
        return;

    var pair = (System.Web.UI.Pair)savedState;
    if (pair.First != null)
    {
        foreach (var id in (IList<string>)pair.First)
        {
            // add the control
        }
    }

    if (pair.Second != null)
        base.LoadViewState(pair.Second);
}
受保护的覆盖对象SaveViewState()
{
var a=此.ControlsList;
var b=base.SaveViewState();
如果(a.Count==0&&b==null)
返回null;
返回新的System.Web.UI.Pair(a,b);
}
受保护的覆盖无效LoadViewState(对象保存状态)
{
if(savedState==null)
返回;
var pair=(System.Web.UI.pair)savedState;
if(pair.First!=null)
{
foreach(在(IList)对中的varid.First)
{
//添加控件
}
}
if(pair.Second!=null)
base.LoadViewState(第二对);
}
这种方法允许您首先初始化子控件,然后为它们加载viewstate


您可能还希望向该控件添加动态添加控件的控件,以便在您开始删除控件后,viewstate的加载不会失败。

您就是那个人。我已经为此挣扎了几天。您的解决方案让我了解了这个问题,以及解决问题的优雅方法。谢谢