giovedì 18 agosto 2011

multi binding fra tabelle con linq

Ciao,

oggi vi riporto un problema ormai frequente quando si comincia ad usare in applicazioni asp linq associato con gridview.

Immaginate di fare una select facendo varie join tra tabelle e poi passarla ad una gridview, sapete qual'è il risultato?

DataBinding:
'<>f__AnonymousType0`2.......... ovvero il campo non viene riconosciuto nella
sorgente dati passata alla gridview


La soluzione è associare il nome della tabella seguita dal nome campo alla proprietà DataField;

DataField="nomeTabella.nomeCampo"


però questo non basta poichè, o sia un problema o un peculiarità, il tutto funziona se si converte il campo in TemplateField.


Per capirci meglio vi riporto un esempio;

Immaginiamo di fare una semplice select fra due tabelle (ovviamente usando linq) e associarli alla gridview:

var query = from C in clienti
join OV in orariVisita on C.id equals OV.idCliente into JoinedCliOrarVis
from OV in JoinedCliOrarVis.DefaultIfEmpty()
select new { C, OV};

MiaDataGridView.DataSource = query;
MiaDataGridView.DataBind();

<asp:GridView ID="GridView4" runat="server" autogeneratecolumns="False"
width="10%">
<asp:BoundField DataField="C.nominativo" HeaderText="Nominativo" />
<asp:BoundField DataField="OV.oraVisita" HeaderText="Orario Visita" />
</asp:GridView>

In questo caso si ottiene l'errore ugualmente, ma se si converte il campo in TemplateField, il campo viene riconosciuto.

<asp:GridView ID="GridView4" runat="server" autogeneratecolumns="False"
width="10%">
<columns>
<asp:templatefield headertext="Nominativo">
<itemtemplate>
<asp:Label ID="NominativoLabel" runat="server"
text='<%# Eval("C.nominativo") %>'></asp:Label>
</itemtemplate>
</asp:templatefield>
<asp:templatefield headertext="Orario Visita">
<itemtemplate>
<asp:Label ID="OraVisitaLabel" runat="server"
text='<%# Eval("OV.oraVisita") %>'></asp:Label>
</itemtemplate>
</asp:templatefield>
</columns>
</asp:GridView>

Nessun commento:

Posta un commento