35

以下にリストされているものと同様のオブジェクト マップがあります。NestedClass のプロパティを GridView にバインドしようとすると、エラーが発生します。

「'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; }
}
4

2 に答える 2

55

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

于 2009-07-28T16:05:13.627 に答える
10

ネストされたプロパティをサポートする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);
    }
}
于 2011-11-09T09:12:29.543 に答える