通常のデータ バインディングでは、通常、式を使用できません。内部では、datagrid はリフレクション (ASP.NET ページで DataBinder.Eval が行う方法でコードを実行するのではなく) を使用して、列にバインドするように指定したプロパティを見つけます。必要なことを行うには、バインディングを式として評価する必要があり、親 - >子関係を探していたことを解決し、そのレベルまで反映します。私の知る限り、グリッドに組み込まれているデータバインディングはあまりにも愚かで、これを行う方法を知ることができません。
私は最近同じ問題を抱えていました。私の解決策は、LINQ プロジェクションを実行し、代わりにそれをグリッドにバインドすることでした。次のようなもの (VB の LINQ 構文に慣れていないため、C# の場合):
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();
そのプロジェクションを含む匿名型のリストが返され、適切な列を にバインドできますSomePropertyFromB
。
追加のカプセル化のために(これを頻繁に行う場合)、プロジェクションを拡張メソッドに入れて、次のようなことができるようにします
var data = GetMyListOfClassAObjectsFromSomewhere().ProjectionForDataGrid();
datagrid.DataSource = data;
datagrid.DataBind();