2010-09-29 2 views
0

je curently mis en place comme ci-dessousL'accès à une propriété à l'intérieur d'une propriété

public class ProptsClass 
{ 
    public class ClassA 
    { 
     public list<ClassB> pcb { get; set; } 
    } 

    public class ClassB 
    { 
     public list<ClassC> pcc { get; set; } 
    } 

    public class ClassC 
    { 
     public string _someproperty { get; set; } 
    } 
} 

ce que je veux faire est de DataBind objet ClassA à un ListView avec l'une des colonnes étant databound à ClassC._someproperty. Lorsque j'essaie de créer une base de données en tant que <%#Eval("Namespace.ProptsClass.ClassA.pcb.pcc._someproperty") %> Je reçois l'erreur: "DataBinding: Namespace ProptsClass.ClassA + ClassB" ne contient pas une propriété portant le nom '_someproperty' ". Quelqu'un peut-il me dire où je me trompe et quelle est la bonne façon de le faire. Deuxièmement, est-il un meilleur moyen que je peux atteindre la même chose dans le code derrière au lieu de ASP.net. Merci d'avance

+2

"classe publique" hahahaa ... omg :) – Timwi

Répondre

4

DataBind sur ListViews et GridViews effectue uniquement une recherche "superficielle" des noms de propriété/champ auxquels lier des colonnes. En outre, il ne sera pas "aplatir" la liste des listes que vous avez dans la structure. Si vous souhaitez lier à un modèle d'objet multiniveau, vous devez soit exposer la propriété enfant sur le parent via une propriété "pass-through", soit projeter les valeurs que vous souhaitez afficher dans une collection unidimensionnelle d'une "vue". -helper "classe. Je choisirais ce dernier dans votre cas, puisque vous voulez que la valeur d'un élément soit accessible de manière multidimensionnelle.

Essayez ceci:

var displayResult = theProptsClass.A.pcb.SelectMany(b=>b.pcc).Select(c._someproperty); 

La fonction SelectMany() agit à « aplatir » la relation entre ClassB et ClassC, et combiné avec Select() retourne toutes les valeurs de _someproperty de tous les C dans tous les hôtes Un A. Vous pouvez enchaîner un autre appel SelectMany() si vous avez une collection de As à partir de laquelle vous avez besoin de projeter une collection à plat de Bs.

Questions connexes