0

ItemDataBoundイベントにコントロールを追加するリストビューがあります。ポストバックが発生すると、新しいコントロールが見つかりません。少し調べてみたところ、ASP .NETでは、ポストバック後でも、毎回これらのコントロールを作成する必要があることがわかりました。そこから、ListViewをif (!Page.IsPostBack)条件付きの外にバインドする関数を移動しました。これで動的コントロールの値を取得しましたが、静的コントロールはデフォルトに設定されています。これが私が達成しようとしていることのサンプルです:

簡潔にするために、この例からいくつかの明白なことを省きました。

<asp:ListView runat="server" ID="MyList" OnItemDataBound="MyList_ItemDataBound">
    <LayoutTemplate>
        <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
    </LayoutTemplate>

    <ItemTemplate>
        <asp:PlaceHolder runat="server" ID="ProductPlaceHolder">
            <asp:TextBox runat="server" ID="StaticField" Text="DefaultText" />
            <asp:PlaceHolder ID="DynamicItems" runat="server" />
        </asp:PlaceHolder>           
    </ItemTemplate>
</asp:ListView>

そしてここにコードビハインドがあります:

protected void MyList_ItemDataBound(object sender, System.Web.UI.WebControls.ListViewItemEventArgs e) {
    PlaceHolder DynamicItems = (PlaceHolder)e.Item.FindControl("DynamicItems");
    DynamicItems.Controls.Add(textbox);
}

したがって、私が言ったように、そのときにデータバインドするだけでPage != PostBackは、ポストバックで動的コントロールを見つけることができません。ページが読み込まれるたびにバインドすると、静的フィールドがデフォルトのテキストに設定されます。

4

2 に答える 2

2

ListView のデータ バインディングを OnInit() イベントに移動してみてください。

于 2009-11-16T19:38:24.337 に答える
0

非常によく似た質問です(ListViewにデータを入力する代わりに、ボタンのセットを生成しています)。簡単に言えば、ポストバックでそれを取り出してリストに再入力するよりも、Viesate のリストにアイテムを保存する必要があることがわかります。

この解決策は、データバインディングを削除することを意味することに注意してください(他の理由でやりたくないかもしれません)。

それが役に立てば幸い。

于 2009-11-16T19:11:02.973 に答える