Utilizzare oggetti personalizzati come origine per Microsoft Reports (.rdlc)
Domanda
In alcuni casi, preferisco lavorare con oggetti personalizzati anziché set di dati e righe di dati fortemente tipizzati. Tuttavia, sembra che Microsoft Reporting (incluso con VS2005) richieda set di dati fortemente tipizzati.
Esiste un modo per utilizzare i miei oggetti personalizzati per progettare e popolare report?
Soluzione
Ho trovato la risposta. Si è possibile. Devi solo aggiungere un oggetto personalizzato come origine dati in Visual Studio.
Altri suggerimenti
Non potrei mai scegliere uno dei miei POCO nell'impostazione Dati report dal mio progetto come modello per il rapporto: l'opzione presunta "globale" menzionata in walkthrough non c'era. Così ho finito per dover modificare l'XML per definire il tipo e un'origine dati imitazione (che in realtà non esiste nel mio progetto).
Assegno i dati di tipo Aies.Core.Model.Invoice.MemberInvoice
al rapporto in codice
reportViewer.LocalReport.DataSources.Add(new ReportDataSource("MemberInvoice", new[] { invoice1 }));
E la definizione personalizzata è:
<DataSources>
<DataSource Name="MemberInvoice">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>3fe04def-105a-4e9b-99db-630c1f8bb2c9</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="MemberInvoice">
<Fields>
<Field Name="MemberId">
<DataField>MemberId</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
<Field Name="DateOfIssue">
<DataField>DateOfIssue</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="DateDue">
<DataField>DateDue</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="Amount">
<DataField>Amount</DataField>
<rd:TypeName>System.Decimal</rd:TypeName>
</Field>
</Fields>
<Query>
<DataSourceName>MemberInvoice</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<rd:DataSetInfo>
<rd:DataSetName>Aies.Core.Model.Invoice</rd:DataSetName>
<rd:TableName>MemberInvoiceData</rd:TableName>
<rd:ObjectDataSourceSelectMethod>GetInvoices</rd:ObjectDataSourceSelectMethod>
<rd:ObjectDataSourceSelectMethodSignature>System.Collections.Generic.IEnumerable`1[Aies.Core.Model.Invoice.MemberInvoice] GetInvoices()</rd:ObjectDataSourceSelectMethodSignature>
<rd:ObjectDataSourceType>Aies.Core.Model.Invoice.MemberInvoiceData, Aies.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</rd:ObjectDataSourceType>
</rd:DataSetInfo>
</DataSet>
</DataSets>
Credo che tu possa configurare SSRS per leggere valori di dati da un oggetto più o meno arbitrario. Questo link descrive l'oggetto IDataReaderFieldProperties nell'API che (IIRC) consente di specificare il metodo getter da richiamare per ottenere un valore.