2009-05-14 9 views
15

Si j'ai une liste < personne> où personne est définie par la classeComment lier un répéteur à une liste <Person> pour mettre également à jour les éléments liés? (2 voies)

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

Et je le liez à un contrôle répéteur asp qui ressemble à ceci:

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

Quel est le meilleur moyen de récupérer les données que l'utilisateur saisit dans les objets?

Je pensais que tout le point de liaison de données était que cela a été géré efficacement pour vous, mais quand j'inspecte la collection Repeater1.Items, il n'y a pas de modifications apportées. Est-ce que je dois écrire du code pour faire quelque chose le long des lignes 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 tel est le cas, pourquoi est la propriété DataItem toujours vide?

Informations complémentaires:

Je Code appelle déjà l'effet de

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

J'ai essayé d'utiliser Bind("Forename"), mais cela ne semble pas apporter l'info de la zone de texte en arrière dans l'objet, dois-je le faire manuellement?

Répondre

8

La réponse simple est que le contrôle Repeater ne prend pas en charge le type de liaison de données bidirectionnelle que vous recherchez. En plus de cela, la propriété DataItem est uniquement utilisée lors de la création de l'élément répéteur et, après l'événement ItemDataBound, elle est définie sur Nothing. Vous ne pouvez donc pas utiliser cette propriété pour obtenir l'objet d'origine que vous avez utilisé lors de la création de l'élément de répéteur spécifique après la publication (comme vous le faites dans votre pseudocode). Vous devrez parcourir les éléments du répéteur, comme vous l'avez suggéré (assurez-vous de vérifier que l'élément est ListItemType.Item ou AlternatingItem avant de faire quoi que ce soit), puis extrayez les valeurs des zones de texte et utilisez-les dans une mise à jour .

+0

Pas la réponse que j'espérais, mais il semble que vous ayez raison. – ilivewithian

2

En plus de ce qui précède, vous devez également lier le répéteur à la liste. En ce moment, les zones de texte sont affectés à la valeur du prénom (ou potentailly lié si vous utilisez le

<# Bind("Forename") %> 
tag

), mais le conteneur Répéteur n'a pas DataItem.

7

Si vous liez le répéteur avec la liste des personnes que vous voulez comme

this.Repeater1.DataSource = GetPersons(); 

tout GetPersons() est une méthode retournant une liste d'objets de la personne vous pouvez utiliser

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

Non, cela remplit le répéteur, mais il n'obtient pas les données saisies par l'utilisateur. Eval est une liaison de données à 1 voie, la question concerne la liaison de données bidirectionnelle. –

Questions connexes