0

我正在开发一个自定义服务器控件,以下是我的 ASPX 页面上的控件标记,

<uc:NoteBook ID="nb1" runat="server">
    <NotePages>
        <uc:NotePage ID="p1" runat="server">
            <asp:DropDownList ID="ddl1" runat="server"></asp:DropDownList>
        </uc:NotePage>
    </NotePages>
</uc:NoteBook>

请注意,此控件具有NotePages实际上是NotePage控件集合的属性。并且NotePage控制可以有任何类型的孩子。

在同一个 aspx 页面上,在Page_Load事件处理程序中,我正在加载一些DropDownList控制项,

if (!this.IsPostBack)
{
    this.ddl1.Items.Add(new ListItem("Class-1", "C1"));
    this.ddl1.Items.Add(new ListItem("Class-2", "C2"));
    this.ddl1.Items.Add(new ListItem("Class-3", "C3"));
}

问题:

现在的问题是在 Post Back 之后,这些DropDownList项目被清除了。这清楚地表明我在这里缺少一些状态管理。

谁能指导我如何处理它?

以下是控制代码。

public class NoteBook : CompositeControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public virtual List<NotePage> NotePages
    {
        get;
        set;
    }

    public NoteBook()
    {
        this.NotePages = new List<NotePage>();
    }

    protected override void CreateChildControls()
    {
        foreach (var c in this.NotePages)
        {
            this.Controls.Add(c);
        }
        base.CreateChildControls();
    }
}

[ParseChildren(false)]
public class NotePage : UserControl
{

}

谢谢。

4

2 回答 2

0

您需要在初始化控件时而不是在加载事件期间添加项目。注意:需要始终添加项目,而不仅仅是在 GET 期间未加载页面时。到加载事件发生时,状态已经初始化。请参阅`控制执行生命周期'

于 2012-11-26T18:15:09.823 回答
0

好的,我解决了。

我们只需要EnsureChildControls()在控件初始化时调用该方法,这会导致在 ViewState/etc 之前创建子控件。事情被调用。

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    this.EnsureChildControls();
}

我在我的NoteBook控件中添加了上面的代码。

于 2012-11-27T07:09:47.497 回答