GridView bound with Properties of nested class
Solution 1
Only immediate properties of an instance can be displayed in a BoundField column.
One must instead use DataBinder.Eval in an itemtemplate to access the nested property instead of assigning it to a boundfield.
Example:
<asp:TemplateField>
<itemtemplate>
<p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p>
</itemtemplate>
</asp:TemplateField>
Alternatively, you can create a custom class which inherits BoundField and overrides GetValue to use DataBinder.Eval, as described in this blog post:
Solution 2
This extension on BoundField calls DataBinder.Eval()
, which does support nested properties:
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);
}
}
Ant Swift
Updated on January 11, 2020Comments
-
Ant Swift over 4 years
I have an object map similar to what's listed below. When I try to bind the properties of NestedClass in a GridView I get the error:
"A field or property with the name 'NestedClass.Name' was not found on the selected data source."
The GridView is bound to an ObjectDataSource and the ObjectDataSource is bound to a fully populated instance of BoundClass.
Is there any way around this?
Sample classes:
public class BoundClass { public string Name { get; set; } public NestedClass NestedClass { get; set; } } public class NestedClass { public string Name { get; set; } }
-
user423430 about 11 yearswayback machine for broken link: web.archive.org/web/20120121123301/http://iridescence.no/post/…