7

リピーターのビューステート、つまりリピーター内のコントロールがビューステートを維持していないという問題があります。

私は次のものを持っています:

リピーター 1:

<asp:Repeater ID="rptImages" runat="server">
<ItemTemplate>
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" />
</ItemTemplate>
</asp:Repeater>

リンク ボタンがクリックされると、CommandArgument の値がページの隠しフィールドに格納されます。

ポストバック時に、prerender イベント ハンドラーが読み込まれるまで、非表示フィールドの値を取得できません。そのため、prerender イベントで非表示フィールドの値を取得し、次のように List プロパティに格納します。

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) {
        this.ImageList.Add(this.SelectedImageIDsInput.Text);
    }

List プロパティは次のようになります。

public List<string> ImageList {
    get {
        if (this.ViewState["ImageList"] == null) {
            this.ViewState["ImageList"] = new List<string>();
        }
        return (List<string>)(this.ViewState["ImageList"]);
    }
    set { this.ViewState["ImageString"] = value; }
}

値を List プロパティに保存したら、2 番目のリピーターをバインドします (ここでも prerender イベント内)。

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList;
this.rptSelectedImages.DataBind();

2 番目のリピーターには、ドロップダウン リストとテキスト ボックスが含まれています。問題は、これらの子コントロールのビューステートが維持されないことです。ポストバックごとにリピーターを再バインドしているため、再構築されているためだと思います。私が知らないのは、どうすればこれを回避できるのでしょうか? ImageList プロパティはポストバック時にのみ更新されるため、ポストバックごとにリピーターを再バインドする必要があることは明らかです。

どんな助けでも大歓迎です。

ありがとうアル

4

2 に答える 2

13

リピーターを再バインドする場合はInit、 がロードされる前に行う必要がありますViewState

また、フラグを確認しIsPostback、ページがポストバックされない場合にのみリピーターをバインドする必要があります。

2 番目のリピーターがバインドされているかどうかを明確にするために、を使用してコントロールを永続化することPreRenderViewStateできません。ViewStateInitPreLoad

すべてのポストバックでバインドを継続するか、ストアまたはリストに格納して、(または変更時に) Session1 回バインドするリストにアクセスできるようにする必要があります。Init

于 2011-09-14T12:41:43.740 に答える
0

CommandArgumentプロパティを隠しフィールドにコピーする意味がわかりません。あなたがすべきことは、でイベントを使用し、ItemCommandイベントRepeaterバブリングを使用することです。次のようにClickイベントを処理できます。LinkButton

repeater.ItemCommand += (sender, eventArgs) => {  
   var commandArgument = eventArgs.CommandArguments;
   ImageList.Add(commandArgument);
   rptSelectedImages.DataSource = ImageList;
   rptSelectedImages.DataBind();
}
于 2011-09-14T12:48:54.860 に答える