0

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

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

protected List<string> ControlsList
{
    get
    {
        if (ViewState["controls"] == null)
        {
            ViewState["controls"] = new List<string>();
        }
        return (List<string>)ViewState["controls"];
    }
}

//Restore Controls based on IDs in ControlsList
protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);        

foreach (string contrID in ControlsList)
    { 
            Control c;
            c = LoadControl("v1.ascx");
            c.ID = "v1-" + contrID;
            PlaceHolder1.Controls.Add(c);
      }

//Button Click adds Control
protected void addControl(object sender, EventArgs e)
{
    Control c;
    c = LoadControl("v1.ascx");
    c.ID = "v1-" + NextID.ToString();
    ControlsList.Add(c.ID);
    PlaceHolder1.Controls.Add(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;

}
4

1 回答 1

1

您应该更改 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);
}

这种方法将让您首先初始化子控件,然后为它们加载视图状态。

您可能还希望将ViewStateModeByIdAttribute添加到动态添加控件的控件中,以便在您开始删除控件时加载视图状态不会失败。

于 2013-02-20T11:21:40.823 回答