class A
{
int ID;
B ClassB;
}
class B
{
string Title;
}
Using the above mock classes as examples - I have a dynamically created GridView. To this I bind (add to the Columns collection) X number of BoundFields and then assign a collection to the DataSource, however, my sub objects are not binding.
The DataField property of the BoundFields is set to "ClassB.Title" and the DataSource is a collection of objects of type A but it keeps throwing the exception "A field or property with the name 'ClassB.Title' was not found on the selected data source. "
Any thoughts why?
Cheers
This is because BoundField uses reflection to evaluate object properties - obviously, class A does not have a property called ClassB.Title
and hence the issue.
You can use template field to work around this issue. For example,
<asp:templatefield headertext="SomeColumn">
<itemtemplate>
<%#Eval("ClassB.Title")%>
</itemtemplate>
</asp:templatefield>
Note that instead of using typical template-field markup such as below, you may use strongly typed expressions such as
<asp:templatefield headertext="SomeColumn">
<itemtemplate>
<%# ((A)(Container.DataItem)).ClassB.Title %>
</itemtemplate>
</asp:templatefield>
Note the type-casting of data-item to your specific class (A
).
EDIT: yet another alternative is to build your own BoundField
that can do nested property lookup - for example:
public class MyBoundField : BoundField
{
protected override object GetValue(Control controlContainer)
{
string dataField = this.DataField;
if (string.IsNullOrEmpty(dataField)) { return null; }
if (!dataField.Contains('.'))
{
// use base implemenation
return base.GetValue(controlContainer);
}
// design time support
if (base.DesignMode)
{
return this.GetDesignTimeValue();
}
// Use data-binder to evaluate nested property look-ups
return DataBinder.Eval(controlContainer, dataField);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With