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"));
}

問題:

問題は、ポストバックの後、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

OK私はそれを解決しました。

コントロールの初期化時にメソッドを呼び出す必要がありEnsureChildControls()ます。これにより、ViewStateなどの前に子コントロールが作成されます。物事は呼ばれます。

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

上記のコードを自分のNoteBookコントロールに追加しました。

于 2012-11-27T07:09:47.497 に答える