2009-05-14 5 views
15

Wenn ich eine Liste < Person> wo Person durch die Klasse definiert istWie binde ich einen Repeater an eine Liste <Person>, um auch die gebundenen Elemente zu aktualisieren? (2-Wege)

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

Und ich es zu einem ASP-Repeater-Steuerelement binden, die wie folgt aussieht:

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

Was ist der beste Weg, um die Daten, die der Benutzer eingibt, wieder in die Objekte zu bekommen?

Ich dachte, dass der ganze Punkt der Datenbindung war, dass dies effektiv für Sie behandelt wurde, aber wenn ich die Repeater1.Items-Auflistung inspiziere, werden keine Änderungen vorgenommen. Muss ich Code zu schreiben, etwas entlang der Linien von

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

zu tun Wenn das der Fall ist, warum ist die DataItem Eigenschaft immer leer?

Zusätzliche Informationen:

Ich bin schon rufen Code die die Wirkung von

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

Ich habe versucht, mit Bind("Forename"), aber dies scheint nicht die Informationen aus dem Text zurück zu holen in das Objekt, muss ich das manuell tun?

Antwort

8

Die einfache Antwort verwenden ist, dass das Repeater-Steuerelement die Art von Zwei-Wege-Datenbindung, die Sie suchen, nicht unterstützt. Darüber hinaus wird die DataItem-Eigenschaft nur während der Erstellung des Repeaterelements verwendet und nach dem ItemDataBound-Ereignis wird es auf nichts festgelegt. Sie können also diese Eigenschaft nicht verwenden, um das ursprüngliche Objekt zu erhalten, das Sie beim Erstellen des spezifischen Repeater-Elements nach dem Postback verwendet haben (wie Sie es in Ihrem Pseudocode tun).

Sie müssen die Repeater-Elemente durchlaufen, wie Sie vorgeschlagen haben (stellen Sie sicher, dass das Element von ListItemType.Item oder AlternatingItem, bevor Sie etwas tun) und extrahieren Sie die Werte aus den Textfeldern und verwenden Sie sie in einem Update .

+0

Nicht die Antwort, auf die ich gehofft hatte, aber es scheint, dass Sie Recht haben. – ilivewithian

2

Zusätzlich müssen Sie den Repeater an die Liste binden. Gerade jetzt die Textfelder auf den Wert des Vornamens zugeordnet sind (oder potentailly gebunden, wenn Sie die Verwendung

<# Bind("Forename") %> 

-Tag), aber der Repeater Container hat keine DataItem.

7

Wenn Sie den Repeater mit der Person Liste binden möchten Sie wie

this.Repeater1.DataSource = GetPersons(); 

während GetPersons() ist eine Methode, um eine Liste von Personen Rückkehr Objekte könnten Sie

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

Nein, dies füllt den Repeater, aber die vom Benutzer eingegebenen Daten werden nicht zurückerhalten. Eval ist eine 1-Weg-Datenbindung, die Frage betrifft die 2-Wege-Datenbindung. –

Verwandte Themen