2009-03-09 25 views
6

Ho un gridview di ASP.net che sto cercando di associare. My DataSource ha una raccolta e 2 delle colonne a cui sono impegnato fanno parte di una sottoclasse. My DataSource ha una sottoclasse chiamata Staff che contiene le informazioni sullo staff. I campi di rilievo SurveyID e NumberOfExceptions si collegano correttamente, ma non è possibile associare Staff.Name e Staff.Office.
Come si associa una colonna della griglia a un valore di sottoclasse?

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

E il codice è dietro:

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

Se scriv searchResults[0].Staff.Name nel codice dietro riesco a vedere il valore, perché è il runtime non essere in grado di valutare Staff.Name in GridView ?

Come si associano le colonne ai valori di sottoclasse? Devo farlo in codebehind?

Qualsiasi aiuto sarebbe gradito,

Mark.

+0

Il "personale" ha un getter/setter per questo? La classe Staff ha getter/setter definiti sia per "Name" che per "Office". Una delle condizioni per DataBinder.Eval (che sono abbastanza sicuro è ciò che viene utilizzato da BoundField per accedere ai dati) è che getter/setter devono essere definiti per il valore che tenta di essere recuperato. –

risposta

8

io credo che si possa arrivare a questo lavoro utilizzando un campo modello e un markup scriptlet ...

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

So che è passato molto tempo da quando è stata data una risposta, ma nel caso ricevessi una notifica: sai se esiste un modo per fare questa stessa cosa, ma come un bind a 2 vie, invece di un Eval? Grazie! – Brett

0

Mark,

sono sicuro al 99,9% che si dovrà gestire questo nel codebehind sull'evento ItemDataBound per la singola riga.

Ricordate è possibile ottenere l'intero oggetto databould da e.Item.DataItem

6

I dati meccanismo di associazione dietro ASP.NET GridView supporta solo un livello di binding. (Contrariamente alla sua controparte Binding di WinForms che supporta multi-livello nel caso di associazione a DataSet/DataTable/DataView).

Hai tre possibili soluzioni:

  1. gestione dell'evento ItemDataBound per ogni riga
  2. Estendere le vostre entità di livello di root con proprietà che espongono le proprietà dell'oggetto bambino e che utilizzano queste proprietà per le espressioni di legame
  3. Anziché utilizzare un BoundField, è possibile utilizzare un campo Modello e generare il contenuto utilizzando un'espressione <% =%> che accede all'elemento dati.
0

La sintassi [Nome]. [Nome] non è supportata da BoundField. Solo nomi di proprietà semplici.

Problemi correlati