2008-10-08 8 views
0

J'ai cureently un mis en place comme ci-dessousComment Databind une propriété dans une propriété

Public ClassA 

property _classB as ClassB 

End Class 

Public ClassB 

property _someProperty as someProperty 

End Class 

ce que je veux faire est d'objet DataBind A à un gridview avec l'une des colonnes étant databound à ClassB._someProperty . Lorsque j'essaie de le cataloguer comme Classb._someProperty, j'obtiens une erreur "Field ou Property non trouvé sur la source de données sélectionnée"

J'ai essayé d'utiliser objectContainerDataSource et de me lier directement au gridview sans succès.

Est-ce que quelqu'un est déjà tombé sur ça?

Répondre

0

J'ai trouvé la façon de le faire est d'utiliser un champ de modèle et eval (voir ci-dessous)

Définir la zone de données en tant que propriété ClassB puis:

<asp:TemplateField HeaderText="_someProperty"> 
<ItemTemplate>  
          <%#Eval("classB._someProperty")%> 

</ItemTemplate> 
</asp:TemplateField> 
2

La liaison de données ordinaire ne permet généralement pas d'expressions. Sous le capot, le DataGrid utilise la réflexion (plutôt que le code d'exécution comme le fait DataBinder.Eval sur une page ASP.NET) pour trouver la propriété que vous spécifiez pour lier à une colonne. Pour faire ce que vous voulez, il faudrait évaluer la liaison en tant qu'expression, déterminer que vous recherchiez une relation parent -> enfant, puis refléter ce niveau. AFAIK la connexion de données intégrée sur la grille est trop bête pour savoir comment le faire.

J'ai eu le même problème récemment, et ma solution était de faire une projection LINQ et de lier cela à la grille à la place. Quelque chose comme ce qui suit (en C# parce que je ne suis pas à l'aise avec la syntaxe LINQ en VB):

IList<ClassA> listOfClassAObjects = GetMyListOfClassAObjectsFromSomewhere(); 
var projection = from ClassA a in listOfClassAObjects 
       select new { SomeProperty = a.SomeProperty, 
           SomeOtherProperty = a.SomeOtherProperty, 
           SomePropertyFromB = a.ClassB.SomeProperty }; 
datagrid.DataSource = projection; 
datagrid.DataBind(); 

Vous récupérerez une liste des types anonymes contenant cette projection, et vous pouvez lier la colonne appropriée à SomePropertyFromB.

pour l'encapsulation supplémentaire (si vous faites cela beaucoup) a mis la projection dans une méthode d'extension de sorte que vous pouvez faire quelque chose comme

var data = GetMyListOfClassAObjectsFromSomewhere().ProjectionForDataGrid(); 
datagrid.DataSource = data; 
datagrid.DataBind(); 
+0

Il utilise LINQ que je crois est que disponible après .net 2.0. comme je suis limité à .net 2.0 est-il un autre moyen? – Dean

+1

Vous aurez besoin du compilateur C# 3.0 pour compiler ceci, mais vous pouvez exécuter le code résultant sur le framework 2.0 assez heureusement. La bibliothèque LINQ (System.Linq) qui se trouve dans l'assembly system.core fait en effet partie de .NET Framework 3.5, mais pour le code ci-dessus, vous n'en avez pas besoin. –

Questions connexes