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();
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
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. –