2009-05-14 9 views
15

Se ho un elenco < persona> dove persona è definita dalla classeCome si associa un ripetitore a un elenco <Person> per aggiornare anche gli elementi associati? (2 vie)

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

E io associarlo a un controllo ripetitore asp che assomiglia a questo:

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

Qual è il modo migliore per ottenere i dati che l'utente digita di nuovo negli oggetti?

Ho pensato che l'intero punto di collegamento dei dati era che questo è stato effettivamente gestito per voi, ma quando ispeziono la collezione Repeater1.Items, non ci sono modifiche apportate. Devo scrivere il codice per fare qualcosa sulla falsariga di

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

Se questo è il caso, perché è la proprietà DataItem sempre vuota?

Ulteriori informazioni:

sto già chiamando il codice e l'effetto della

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

Ho provato con Bind("Forename"), ma questo non sembra portare le informazioni dal TextBox posteriore nell'oggetto, devo farlo manualmente?

risposta

8

La semplice risposta è che il controllo Repeater non supporta il tipo di associazione dati bidirezionale che stai cercando. Inoltre, la proprietà DataItem viene utilizzata solo durante la creazione dell'elemento ripetitore e, dopo l'evento ItemDataBound, non viene impostato su nulla. Quindi non puoi usare quella proprietà per ottenere l'oggetto originale che hai usato quando hai creato l'elemento specifico del ripetitore dopo il postback (come fai nel tuo pseudocodice).

Si dovrà ciclo tra gli elementi ripetitore, come lei ha suggerito (assicuratevi di controllare che l'articolo è di ListItemType.Item o AlternatingItem prima di fare qualcosa) e quindi estrarre i valori dalle caselle di testo e utilizzarli in un aggiornamento .

+0

Non è la risposta che speravo, ma sembra che tu abbia ragione. – ilivewithian

2

In aggiunta a quanto sopra, è inoltre necessario associare il ripetitore all'elenco. In questo momento le caselle di testo vengono assegnati al valore del Nome (o potentailly legato se si utilizza il tag

<# Bind("Forename") %> 

), ma il ripetitore contenitore non ha DataItem.

7

Se si associa il ripetitore con l'elenco persona che si desidera come

this.Repeater1.DataSource = GetPersons(); 

mentre GetPersons() è un metodo che restituisce un elenco di persone da oggetti si potrebbe usare

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

No, questo popola il ripetitore, ma non recupera i dati immessi dall'utente. Eval è un binding di dati a 1 via, la domanda è relativa al binding dei dati a 2 vie. –