以下にリストされているようなオブジェクトマップがあります。 GridViewでNestedClassのプロパティをバインドしようとすると、次のエラーが発生します。
「選択したデータソースに「NestedClass.Name」という名前のフィールドまたはプロパティが見つかりませんでした。」
GridViewはObjectDataSourceにバインドされ、ObjectDataSourceは完全に設定されたBoundClassのインスタンスにバインドされます。
これを回避する方法はありますか?
サンプルクラス:
public class BoundClass
{
public string Name { get; set; }
public NestedClass NestedClass { get; set; }
}
public class NestedClass
{
public string Name { get; set; }
}
BoundField列に表示できるのは、インスタンスの即時プロパティのみです。
ネストされたプロパティにアクセスするには、境界フィールドに割り当てるのではなく、itemtemplateでDataBinder.Evalを使用する必要があります。
例:
<asp:TemplateField>
<itemtemplate>
<p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p>
</itemtemplate>
</asp:TemplateField>
または、次のブログ投稿で説明されているように、BoundFieldを継承し、GetValueをオーバーライドしてDataBinder.Evalを使用するカスタムクラスを作成することもできます。
BoundFieldのこの拡張機能は、ネストされたプロパティをサポートするDataBinder.Eval()
を呼び出します。
public class BetterBoundField : BoundField
{
protected override object GetValue(Control controlContainer)
{
if (DataField.Contains("."))
{
var component = DataBinder.GetDataItem(controlContainer);
return DataBinder.Eval(component, DataField);
}
return base.GetValue(controlContainer);
}
}