GridView与嵌套类的Properties绑定

时间:2009-07-15 09:28:38

标签: c# asp.net gridview objectdatasource

我有一个类似于下面列出的对象图。当我尝试在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; }
}

2 个答案:

答案 0 :(得分:53)

只能在BoundField列中显示实例的直接属性。

必须在itemtemplate中使用DataBinder.Eval来访问嵌套属性,而不是将其分配给boundfield。

示例:

<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

答案 1 :(得分: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);
    }
}