2009-03-09 8 views
6

Tengo un gridview ASP.net al que estoy intentando enlazar. My DataSource tiene una colección y 2 de las columnas a las que me estoy vinculando son parte de una subclase. My DataSource tiene una subclase llamada Staff que contiene la información del personal. The boundfields SurveyID y NumberOfExceptions se unen bien, pero Staff.Name y Staff.Office no se pueden enlazar.
¿Cómo se vincula una columna gridview a un valor de subclase?

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" ... 

Y el código subyacente es:

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

Si escribo searchResults[0].Staff.Name en el código detrás de lo que puedo ver el valor, ¿por qué es el tiempo de ejecución no ser capaz de evaluar Staff.Name en el gridview ?

¿Cómo se unen las columnas a los valores de las subclases? ¿Tengo que hacerlo en código subyacente?

Cualquier ayuda sería apreciada,

Marca.

+0

¿El "Staff" tiene un getter/setter para ello? ¿La clase Staff tiene getter/setters definidos tanto para "Nombre" como para "Office"? Una de las condiciones para DataBinder.Eval (que estoy bastante seguro es lo que BoundField usa para acceder a los datos) es que getter/setters se defina para el valor que se intenta recuperar. –

Respuesta

8

Creo que se puede conseguir que esto funcione utilizando un campo de plantilla y un margen de beneficio scriplet ...

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

Sé que ha pasado mucho tiempo desde que se respondió esto, pero en caso de que recibas una notificación, ¿sabes si hay una manera de hacer lo mismo, pero como un enlace de 2 vías, en lugar de solo una evaluación? ¡Gracias! – Brett

0

Marcos,

yo soy un 99,9% seguro de que va a tener que manejar esto en el código subyacente en el caso ItemDataBound para la fila individual.

Recuerde que usted puede conseguir todo el objeto databould de e.Item.DataItem

6

Los datos mecanismo de enlace detrás de ASP.NET GridView admite solo un nivel de enlaces. (a diferencia de su contraparte WinForms Binding que admite varios niveles en el caso de vincular a un DataSet/DataTable/DataView).

Tiene tres soluciones posibles:

  1. controlar el evento ItemDataBound para cada fila
  2. La extensión de sus entidades de nivel de raíz con propiedades que exponen las propiedades del objeto infantil y la utilización de estas propiedades para las expresiones de enlace
  3. En lugar de usar un BoundField, puede usar un campo de plantilla y generar el contenido utilizando una expresión <% =%> que acceda al elemento de datos.
0

El [Nombre]. [Nombre] sintaxis no es compatible con BoundField. Solo nombres de propiedad simples.

Cuestiones relacionadas