2009-07-15 5 views
33

Ho una mappa di oggetti simile a quanto elencato di seguito. Quando provo a legare le proprietà di NestedClass in un GridView ottengo l'errore:GridView associato a Proprietà di classe nidificata

"A field or property with the name 'NestedClass.Name' was not found on the selected data source."

Il GridView è associato a un ObjectDataSource e ObjectDataSource è destinata a un'istanza completamente popolato di BoundClass.

C'è qualche modo per aggirare questo?

classi campione:

public class BoundClass 
{ 
    public string Name { get; set; } 
    public NestedClass NestedClass { get; set; } 
} 

public class NestedClass 
{ 
    public string Name { get; set; } 
} 
+0

Il nome della colonna 'NestedClass.Name' non esiste dai dati da cui lo riattiva. – waqasahmed

risposta

52

proprietà Solo immediati di un'istanza possono essere visualizzati in una colonna BoundField.

Si deve invece utilizzare DataBinder.Eval in un itemtemplate per accedere alla proprietà nidificata anziché assegnarla a un campo vincolato.

Esempio:

<asp:TemplateField> 
    <itemtemplate> 
     <p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p> 
    </itemtemplate> 
</asp:TemplateField> 

In alternativa, è possibile creare una classe personalizzata che eredita BoundField e sovrascrive GetValue di utilizzare DataBinder.Eval, come descritto in questo post del blog:

http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

+8

macchina di ritorno per collegamento interrotto: http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx – user423430

10

Questo l'estensione su BoundField chiama DataBinder.Eval(), che supporta le proprietà nidificate:

public class BetterBoundField : BoundField 
{ 
    protected override object GetValue(Control controlContainer) 
    { 
     if (DataField.Contains(".")) 
     { 
      var component = DataBinder.GetDataItem(controlContainer); 
      return DataBinder.Eval(component, DataField); 
     } 
     return base.GetValue(controlContainer); 
    } 
} 
+0

+1 per il metodo di estensione – mcfea