2010-10-08 21 views
4

Je mets la source de données de mon répéteur dans une liste (MyProducts est une classe simple, composée uniquement de get/setters). Après cela et DataBind(), je peux voir en mode de débogage que DataItem de chaque Repeater.Items est null. Lorsque vous effectuez une publication et essayez de mettre à jour MyProducts, le Repeater.Items [n] .DataItem est toujours null et je ne suis pas en mesure de le lancer, pour faire mon travail.DataItem sur Repeater.Items est toujours null

Pourquoi DataItem n'est-il pas défini sur chaque RepeaterItem, lorsque je repère mon répéteur? Je ne peux pas comprendre/Google. Tous les autres aspects de mon code fonctionne correctement (la sortie de données de myProducts à ASPX, en utilisant par exemple:

<asp:TextBox runat="server" id="q" Text='<%# DataBinder.Eval(Container.DataItem, "Quantity")%>'></asp:TextBox> 

Code Plus:

public class MyProducts 
    { 
     public string Number 
     { 
      get; set; 
     } 

     public decimal Price 
     { 
      get; set; 
     } 

     public decimal Quantity 
     { 
      get; set; 
     } 

     public decimal Total 
     { 
      get { return Quantity * Price; } 
     } 
    } 

Génération:

public List<MyProducts> TheProducts 
{ 
get { // Invoking webservice, getting response as xml and converting it to a list of MyProducts } 
} 

Mon contrôle de l'utilisateur:

// Bind products in cart 
r.DataSource = TheProducts; 
r.DataBind(); 
// Debugging "r.Items[n].DataItem" now shows "null", eventhough all objects has been correctly binded 

Modifier # 2, l'information de débogage. DataSource est correctement chargé, mais Repeater.Items [3]. DataItem est null. Cela devrait avoir une valeur, n'est-ce pas? screenshot


Edit # 3, je reçois maintenant, je pensais que DataItem était toujours accessible lorsque DataSource est définie, et ne pense pas d'inclure le code complet (j'ai essayé d'y accéder à Page_Load).

Une fois que l'utilisateur a modifié une valeur de quantité, j'ai voulu enregistrer la nouvelle quantité pour un MyProducts. Je l'ai résolu en plaçant un champ caché qui contient l'identifiant de MyProducts, afin que je puisse le rechercher manuellement et obtenir l'objet MyProducts à partir de là.

Merci à emremp, Mark Avenius et tous les autres qui campèrent.

+1

Vous pourriez nous donner un code pour travailler avec ... –

+0

J'ai édité mon poste et inséré plus de code. Bien que ce soit assez basique, je ne pense pas que cela apportera des éclaircissements. J'avais "espéré" que j'avais manqué quelque chose de simple et que quelqu'un pouvait le signaler pour moi. Je trouve très particulier que je suis capable de lier MyProduct-objects mais DataItem est nul ... – Certs

+0

Qu'essayez-vous de réaliser ici?Votre "Quantité" est-elle liée au répéteur? – bla

Répondre

5

Dans quel but avez-vous besoin de la liste? Une fois la page rendue, la liste à laquelle le répéteur est lié n'est pas conservée. Si vous avez besoin de le garder, vous pouvez le mettre dans la session et le récupérer au besoin (sur Page_Load, par exemple):

private List<MyProducts> _myList; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    _myList = Session[MYPRODUCTSKEY] as IList; 
} 

Vous pouvez également tout mettre dans votre getter (vérifiez la première session, et invoquer la webservice si nécessaire):

public List<MyProducts> TheProducts 
{ 
get 
{ 
    if(Session[MYPRODUCTSKEY] == null) 
     Session[MYPRODUCTSKEY] = //invoke webservice 
    return Session[MYPRODUCTSKEY] as List<MyProducts>; 
} 
} 
2

http://www.netnewsgroups.net/aspnet/t4049-question-repeater-dataitem.aspx

« DataItem est là que pour le processus de création de l'élément, qui est ItemCreated et méthodes ItemDataBound (ItemCreated quand il se produit en raison d'appeler à D ataBind). "

Vous pouvez ajouter la méthode ItemDataBound et essayer d'obtenir DataItem.

+0

Correct, mais de toute façon, une fois que les événements de liaison ont été déclenchés, la liste d'origine n'est plus conservée. Je pense que c'était l'intention du PO. –

+0

Je veux dire que la méthode r_ItemDataBound (Object Sender, RepeaterItemEventArgs e) n'est pas une nouvelle méthode ItemDataBound. – emremp