15

リスト<Person>があり、personがクラスによって定義されている場合

class Person
{
   string Forename
   {
      get;set;
   }
   string Surname
   {
      get; set;
   }
}

そして、私はそれを次のようなaspリピーターコントロールにバインドします:

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Label ID="lblForename" runat="server" Text="Forname" AssociatedControlID="txtForename" />
        <asp:TextBox ID="txtForename" runat="server" Text='<%# ((Person)Container.DataItem).Forename %>' />
        <br />
        <asp:Label ID="lblSurname" runat="server" Text="Forname" AssociatedControlID="txtSurname" />
        <asp:TextBox ID="txtSurname" runat="server" Text='<%# ((Person)Container.DataItem).Surname %>' />
        <br />
    </ItemTemplate>
</asp:Repeater>

ユーザーが入力したデータをオブジェクトに戻すための最良の方法は何ですか?

データバインディングの全体的なポイントは、これが効果的に処理されることだと思いましたが、Repeater1.Itemsコレクションを調べたところ、変更はありません。の線に沿って何かをするためにコードを書く必要がありますか?

//This is only intended to be pseudo code
for each item in Repeater1.Items
    ((Person)item.DataItem).Forename = item.FindControl("txtForname").Text;
end for

その場合、DataItemプロパティが常に空になるのはなぜですか?

追加情報:

私はすでにコードを次の効果と呼んでいます

this.Repeater1.DataSource =  this.PersonList;
this.Repeater1.DataBind();

を使用してみましBind("Forename")たが、TextBoxからの情報がオブジェクトに戻されないようです。手動で行う必要がありますか?

4

3 に答える 3

8

簡単な答えは、Repeaterコントロールは、探している種類の双方向データバインディングをサポートしていないということです。さらに、DataItemプロパティは、リピーターアイテムの作成中にのみ使用され、ItemDataBoundイベントの後は何にも設定されません。したがって、そのプロパティを使用して、ポストバック後に特定のリピーターアイテムを作成するときに使用した元のオブジェクトを取得することはできません(擬似コードで行っているように)。

提案したように、リピーターアイテムをループして(アイテムがListItemType.ItemまたはAlternatingItemであることを確認してから何かを行う)、テキストボックスから値を抽出して更新に使用する必要があります。

于 2009-05-14T17:10:19.967 に答える
7

リピーターを好きな人のリストにバインドする場合

this.Repeater1.DataSource =  GetPersons();

GetPersons()は、使用できる人物オブジェクトのリストを返すメソッドです。

<asp:TextBox ID="txtForename" runat="server" Text='<%# Eval("Forename") %>' />
于 2009-05-14T16:03:35.777 に答える
2

上記に加えて、リピーターをリストにバインドする必要もあります。現在、テキストボックスはフォアネームの値に割り当てられています(または、

<# Bind("Forename") %>

タグ)が、リピーターコンテナにはDataItemがありません。

于 2009-05-14T15:57:01.440 に答える