0

私は現在、以下のような設定をしています

Public ClassA

property _classB as ClassB

End Class

Public ClassB

property _someProperty as someProperty 

End Class

私がやりたいことは、オブジェクト A をグリッドビューにデータバインドし、列の 1 つを ClassB._someProperty にデータバインドすることです。Classb._someProperty としてデータバインドしようとすると、「選択したデータソースにフィールドまたはプロパティが見つかりません」というエラーが表示されます

objectContainerDataSource を使用しようとしましたが、グリッドビューに直接バインドしても成功しませんでした。

過去にこれに遭遇した人はいますか?

4

2 に答える 2

2

通常のデータ バインディングでは、通常、式を使用できません。内部では、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();
于 2008-10-08T10:51:34.673 に答える
0

これを行う方法は、テンプレート フィールドと eval を使用することです (以下を参照)。

datafield をプロパティ classB として設定してから、次のようにします。

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

</ItemTemplate>
</asp:TemplateField>
于 2008-10-08T14:02:07.330 に答える