Как привязать повторитель к списку <Person>, чтобы также обновить связанные элементы? (2 пути) - PullRequest
15 голосов
/ 14 мая 2009

Если у меня есть список <Персона>, где личность определяется классом

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 обратно в объект, нужно ли это делать вручную?

Ответы [ 3 ]

8 голосов
/ 14 мая 2009

Простой ответ заключается в том, что элемент управления Repeater не поддерживает тот тип двусторонней привязки данных, который вы ищете. Кроме того, свойство DataItem используется только во время создания элемента повторителя, а после события ItemDataBound оно устанавливается в ничто. Таким образом, вы не можете использовать это свойство, чтобы получить исходный объект, который вы использовали при создании конкретного элемента повторителя после обратной передачи (как вы делаете в своем псевдокоде).

Вам придется циклически просматривать элементы повторителя, как вы предлагали (убедитесь, что элемент имеет ListItemType.Item или AlternatingItem, прежде чем что-либо делать), а затем извлечь значения из текстовых полей и использовать их в обновлении.

7 голосов
/ 14 мая 2009

Если вы связываете повторитель с нужным вам списком людей, например

this.Repeater1.DataSource =  GetPersons();

while GetPersons () - метод, возвращающий список объектов person Вы могли бы использовать

<asp:TextBox ID="txtForename" runat="server" Text='<%# Eval("Forename") %>' />
2 голосов
/ 14 мая 2009

В дополнение к вышесказанному, вам также необходимо привязать ретранслятор к списку. Прямо сейчас текстовые поля присваиваются значению имени (или могут быть связаны, если вы используете

<# Bind("Forename") %>

), но в контейнере ретранслятора отсутствует DataItem.

...