2010-04-16 11 views
0

J'ai suivi le post suivant sur l'utilisation de plusieurs ItemTemplates dans un contrôle ListView. Alors que cet exemple produit des résultats, j'essaie de comprendre comment passer un objet à travers le contrôle utilisateur de ItemTemplate, ce que je ne suis pas capable de faire/comprendre.Transférer l'objet à ListView ItemTemplate chargé dynamiquement

protected void lvwComments_OnItemCreated(object sender, ListViewItemEventArgs e) 
    { 
     ListViewDataItem currentItem = (e.Item as ListViewDataItem); 
     Comment comment = (Comment)currentItem.DataItem; 

     if (comment == null) 
      return; 

     string controlPath = string.Empty; 

     switch (comment.Type) 
     { 
      case CommentType.User: 
       controlPath = "~/layouts/controls/General Comment.ascx"; 
       break; 
      case CommentType.Official: 
       controlPath = "~/layouts/controls/Official Comment.ascx"; 
       break; 
     } 
     lvwComments.ItemTemplate = LoadTemplate(Controlpath); 
    } 

L'utilisateur contrôle est la suivante:

public partial class OfficialComment : UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

Dans l'exemple, les valeurs sont émis dans la page ascx:

<%# Eval("ItemName") %> 

mais je besoin d'accéder à la ListItem dans ce contrôle pour faire une autre logique. Je n'arrive pas à comprendre comment envoyer mes commentaires. L'objet émetteur et EventArgs ne contiennent pas les informations.

EDIT: Idéalement, je voudrais obtenir une explication quant à la façon dont le contrôle accède au dataitem lorsque vous utilisez le <% # Eval%> déclaration. Ce que j'ai pu déterminer, est le moyen suivant pour accéder à l'élément actuel:

J'ai créé un contrôle ListView personnalisé, qui définit le dataItemIndex sur ItemCreating.

Dans mon contrôle commentaire officiel, j'ajouter ce qui suit:

List<Comment> commentList = ((CommentListView)this.Parent.Parent.Parent).DataSource as List<Comment>; 

if (commentList != null) 
{ 
    int currentIndex = ((ListViewDataItem)this.Parent).DataItemIndex; 
    Comment currentItem = commentList[currentIndex]; 
} 

Répondre

0

Bien qu'il existe des documents sur des modèles dynamiques de l'objet, aucun exemple progressé grâce à l'accès aux données autres que le <% # Eval%> fonction. Après avoir essayé quelques méthodes, montrées dans ma question, je n'étais pas fan de devoir traverser récursivement l'arbre de contrôle.

Ce que j'ai pu faire est de créer une classe qui hérite de UserControl. Cette classe définira mon DataItem:

public partial class ListViewTemplateControl<T> : UserControl where T : class 
{ 
    public T CurrentItem { get; set; } 
} 

Puis, dans mon ListView, je peux effectuer les opérations suivantes:

protected void lvwComments_OnItemCreated(object sender, ListViewItemEventArgs e) 
    { 
     ListViewDataItem currentItem = (e.Item as ListViewDataItem); 
     Comment comment = (Comment)currentItem.DataItem; 

     if (comment == null) 
      return; 

     string controlPath = string.Empty; 

     switch (comment.Type) 
     { 
      case CommentType.User: 
       controlPath = "~/layouts/controls/General Comment.ascx"; 
       break; 
      case CommentType.Official: 
       controlPath = "~/layouts/controls/Official Comment.ascx"; 
       break; 
     } 

     ListViewTemplateControl<Comment> templateControl = LoadControl(controlPath) as ListViewTemplateControl<Comment>; 

     if (templateControl != null) 
     { 
      templateControl.CurrentItem = comment; 
      templateControl.ID = comment.ItemID; 
      lvwComments.Controls.Add(templateControl); 
     } 
    } 

Dans mon contrôle de modèle, je peux maintenant effectuer toute ma logique personnalisée basée sur la CurrentItem (DataItem) que je traverse. La seule mise en garde à cela est que la fonction <% # Eval%> ne fonctionnera pas maintenant.

Questions connexes