2009-05-14 13 views
15

Jeśli mam listę < Person> gdzie osoba jest zdefiniowana przez klasęJak powiązać repeater z Listą <Person>, aby również zaktualizować powiązane elementy? (2-way)

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

I wiążę go do kontroli repeater asp, która wygląda tak:

<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> 

Jaki jest najlepszy sposób na uzyskanie danych, które użytkownik wpisze z powrotem w obiekty?

Wydaje mi się, że cały proces wiązania danych polegał na tym, że zostało to skutecznie obsłużone, ale kiedy sprawdzam kolekcję Repeater1.Items, nie wprowadzono żadnych zmian. Muszę napisać kod, aby zrobić coś wzdłuż linii

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

Jeśli tak jest, to dlaczego jest własnością DataItem zawsze pusta?

Dodatkowe informacje:

jestem już wywołanie kodu The efekt

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

Próbowałem za pomocą Bind("Forename"), ale to nie wydaje się, aby doprowadzić info z TextBox powrotem do obiektu, czy muszę to zrobić ręcznie?

Odpowiedz

8

Prosta odpowiedź jest to, że kontrolka Repeater nie obsługuje tego rodzaju dwukierunkowego wiązania danych, którego szukasz. Ponadto właściwość DataItem jest używana tylko podczas tworzenia elementu repeater, a po zdarzeniu ItemDataBound jest ustawiona na nic. Tak więc nie można użyć tej właściwości, aby uzyskać oryginalny obiekt użyty podczas tworzenia określonego elementu wzmacniacza po odświeżeniu (tak jak w przypadku pseudokodowania).

Będziesz musiał przechodzić przez elementy przemiennika, jak zasugerowałeś (upewnij się, że przed wywołaniem czegokolwiek element jest z ListItemType.Item lub AlternatingItem), a następnie wyodrębnij wartości z pól tekstowych i użyj ich w aktualizacji .

+0

Nie odpowiedź, na którą liczyłem, ale wygląda na to, że masz rację. – ilivewithian

2

Oprócz powyższego należy również związać wzmacniacz z Listą. Teraz pola tekstowe są przypisane do wartości imię (lub potentailly związany jeśli użyć tagu

<# Bind("Forename") %> 

), ale Pojemnik Repeater ma DataItem.

7

Jeśli powiązać Repeater z listy osoby, którą chcesz jak

this.Repeater1.DataSource = GetPersons(); 

podczas GetPersons() to metoda powrocie listę osobę obiektów można użyć

<asp:TextBox ID="txtForename" runat="server" Text='<%# Eval("Forename") %>' /> 
+4

Nie, to zapełnia repeater, ale nie odzyskuje danych wprowadzonych przez użytkownika. Eval to jednokierunkowe powiązanie danych, pytanie dotyczy dwukierunkowego powiązania danych. –

Powiązane problemy