Mark Kadlec
Mark Kadlec

Reputation: 8440

How do you bind a gridview column to a subclass value?

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.

Upvotes: 6

Views: 11169

Answers (4)

Sergiu Damian
Sergiu Damian

Reputation: 1428

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.

Upvotes: 6

Tor Haugen
Tor Haugen

Reputation: 19627

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

Upvotes: 0

Josh Stodola
Josh Stodola

Reputation: 82483

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>

Upvotes: 9

Mitchel Sellers
Mitchel Sellers

Reputation: 63126

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

Upvotes: 0

Related Questions