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; }
}
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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:
Method 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);
}
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0