我有一个类似于下面列出的对象图。当我尝试在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; }
}
答案 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,如本博文中所述:
答案 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);
}
}