views:

1511

answers:

4

I have a ASP.net gridview that I am trying bind to. My DataSource has a collection and 2 of the columns I am binding to are part of a subclass. My DataSource has a subclass called Staff the contains the staff information. The boundfields SurveyID and NumberOfExceptions bind fine, but the Staff.Name and Staff.Office cannot be bound.

asp:BoundField DataField="SurveyID" HeaderText="ID" ...
asp:BoundField DataField="Staff.Name" HeaderText="Name" ...
asp:BoundField DataField="Staff.Office" HeaderText="Office" ...
asp:BoundField DataField="NumberOfExceptions" HeaderText="Exceptions" ...

And the code behind is:

uxSurveyGrid.DataSource = searchResults;
uxSurveyGrid.DataBind();

If I type searchResults[0].Staff.Name in the code behind I can see the value, why is the runtime not being able to evaluate Staff.Name in the gridview?

How do you bind the columns to the subclass values? Do I have to do it in codebehind?

Any help would be appreciated,

Mark.

A: 

Mark,

I am 99.9% sure that you will have to handle this in the codebehind on the ItemDataBound event for the individual row.

Remember you can get the whole databould object from e.Item.DataItem

Mitchel Sellers
+2  A: 

I believe you can get this to work using a Template field and a markup scriptlet...

    <asp:TemplateField>
        <ItemTemplate>
            <asp:Label Id="lblSubclassVal" runat="server" Text="<%# DataBinder.Eval(Container.DataItem, "SubClass.PropertyName")%>"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
Josh Stodola
+3  A: 

The data binding mechanism behind ASP.NET GridView supports only one level bindings. (as opposed to its WinForms Binding counterpart that supports multi-level in the case of binding to a DataSet / DataTable / DataView).

You have three possible solutions:

  1. Handling the ItemDataBound event for each row
  2. Extending your root level entities with properties that expose the child object properties and using these properties for the binding expressions
  3. Instead of using a BoundField you could use a Template Field and generate the content using a <%= %> expression that accesses the Data Item.
Sergiu Damian
A: 

The [Name].[Name] syntax is not supported by BoundField. Only simple property names.

Tor Haugen