0

IBindableTemplate をホストし、何らかの条件に基づいてマークアップをコントロールに動的にロードする複合データ バインド コントロールがあります。ここで、これらの子コントロールが複合コントロールに読み込まれ、ポストバックがあると、子コントロールのビューステートが失われます。子コントロールのビューステートをポストバックに保存する方法はありますか?

私も参照します。http://scottonwriting.net/sowblog/posts/2129.aspxを使用したスコットの説明に。しかし役に立たない。

4

2 に答える 2

0

あなたの理論的なコードは私の状況にほぼ近いですが、テンプレートクラスを IBindable から拡張しないという大きな違いが1つだけあります。マークアップ自体でテンプレートのコントロールを提供する必要があります。

Scott も、あなたが行ったようにテンプレートにコントロールを追加すると、

         #region ITemplate Members
         public void InstantiateIn(Control container)
         {
             Label label = new Label();
             label.Text = "Label";
             container.Controls.Add(label);

             TextBox textbox = new TextBox();
             container.Controls.Add(textbox);
         }
         #endregion

その後、ビューステートはすべてのポストバックで自動的に保持されます。必要なのは、マークアップでテンプレートをインスタンス化し、ポストバック時にビューステートを保持し、別のデータでテンプレートを再起動した場合でも、コントロールのステータスを取得できるようにすることだけです。

于 2009-03-23T08:22:54.987 に答える
0

十分な情報がありません。コントロールはいつ作成しますか? それらを Controls コレクションにいつ追加しますか? 状態とは何ですか?ポストバックで変化しますか?

ビューステートは、適切なタイミングでコントロールが追加された場合、ページ サイクルの最後 (ポストバックかどうかに関係なく) に自動的に保存されます。

後でコントロールを追加する場合、何らかのイベントですべての初期化が完了した後では遅すぎます。

アップデート

コードがなければ、故障が発生した場所を推測するのは困難です。いくつかの条件に基づいてコントロールをロードできるカスタム テンプレートを使用して Repeater を調べてみましょう。このサンプルは機能していますが、テンプレートの割り当てが Page_Load で行われた場合は失敗します。これはあなたの状況に似ていますか?

形:

<div>
    <asp:Repeater ID="repeater" runat="server" />
    <asp:Button ID="submitButton" runat="server" Text="Submit" onclick="submitButton_Click" />
    <asp:Button ID="postButton" runat="server" Text="PostBack" />
</div>

コード:

public partial class _Default : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        repeater.ItemTemplate = new MyTemplate();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        //however, if I was to move repeater.ItemTemplate = new MyTemplate() here
        //it would not reload the view state
        if (!IsPostBack)
        {
            repeater.DataSource = new int[] { 1, 2, 3, 4, 5 };
            repeater.DataBind();
        }
    }

    protected void submitButton_Click(object sender, EventArgs e)
    {
        submitButton.Text = "Do it again";
    }
}

public class MyTemplate : IBindableTemplate, INamingContainer
{
    #region IBindableTemplate Members
    public System.Collections.Specialized.IOrderedDictionary ExtractValues(Control container)
    {
        OrderedDictionary dictionary = new OrderedDictionary();
        return dictionary;
    }
    #endregion

    #region ITemplate Members
    public void InstantiateIn(Control container)
    {
        Label label = new Label();
        label.Text = "Label";
        container.Controls.Add(label);

        TextBox textbox = new TextBox();
        container.Controls.Add(textbox);
    }
    #endregion
}
于 2009-03-19T15:31:38.497 に答える