web-dev-qa-db-ja.com

ネストされたクラスのプロパティにバインドされたGridView

以下にリストされているようなオブジェクトマップがあります。 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; }
}
34
Ant Swift

BoundField列に表示できるのは、インスタンスの即時プロパティのみです。

ネストされたプロパティにアクセスするには、境界フィールドに割り当てるのではなく、itemtemplateでDataBinder.Evalを使用する必要があります。

例:

<asp:TemplateField>
    <itemtemplate>
        <p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p>
    </itemtemplate>
</asp:TemplateField>

または、次のブログ投稿で説明されているように、BoundFieldを継承し、GetValueをオーバーライドしてDataBinder.Evalを使用するカスタムクラスを作成することもできます。

http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

54
Evan

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);
    }
}
10
Sjoerd