2009-05-14 7 views
15

Si tengo una lista < persona> donde la persona se define por la clase¿Cómo puedo vincular un repetidor a una lista <Person> para actualizar también los elementos enlazados? (2 vías)

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

Y se unen a un control del repetidor asp que tiene este aspecto:

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

¿Cuál es la mejor forma de obtener los datos que el usuario ingresa nuevamente en los objetos?

Pensé que el objetivo del enlace de datos era que esto se manejó con eficacia para usted, pero cuando inspecciono la colección Repeater1.Items, no se realizan cambios. ¿Tengo que escribir código para hacer algo en la línea de

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

Si ese es el caso, ¿por qué es la propiedad DataItem siempre vacía?

Otros detalles:

ya estoy llamando código el efecto de

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

He intentado usar Bind("Forename"), pero esto no parece llevar la información desde el cuadro de texto de vuelta en el objeto, ¿tengo que hacer esto manualmente?

Respuesta

8

La respuesta simple es que el control Repeater no es compatible con el tipo de enlace de datos bidireccional que está buscando. Además de eso, la propiedad DataItem solo se usa durante la creación del elemento repetidor, y después del evento ItemDataBound, se establece en nada. Por lo tanto, no puede usar esa propiedad para obtener el objeto original que utilizó al crear el elemento repetidor específico después de la devolución (como lo hace en su pseudocódigo).

Tendrá que recorrer los elementos del repetidor, como sugirió (asegúrese de comprobar que el elemento sea de ListItemType.Item o AlternatingItem antes de hacer nada) y luego extraer los valores de los cuadros de texto y usarlos en una actualización .

+0

No era la respuesta que esperaba, pero parece que tienes razón. – ilivewithian

2

Además de lo anterior, también debe vincular el repetidor a la Lista. En este momento los cuadros de texto se asignan al valor del Nombre de pila (o potentailly obligado si se utiliza la etiqueta

<# Bind("Forename") %> 

), pero el repetidor contenedor no tiene DataItem.

7

Si se unen el repetidor con la lista persona que desea como

this.Repeater1.DataSource = GetPersons(); 

mientras GetPersons() es un método devolver una lista de persona objetos podría utilizar

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

No, esto rellena el repetidor, pero no recupera los datos ingresados ​​por el usuario. Eval es un enlace de datos de 1 vía, la pregunta es sobre el enlace de datos bidireccional. –

Cuestiones relacionadas