Utilice objetos personalizados como origen para Microsoft Reports (.rdlc)
Pregunta
En algunos casos, prefiero trabajar con objetos personalizados en lugar de conjuntos de datos y filas de datos fuertemente tipados.Sin embargo, parece que Microsoft Reporting (incluido con VS2005) requiere conjuntos de datos fuertemente tipados.
¿Existe alguna forma de utilizar mis objetos personalizados para diseñar y completar informes?
Solución
Encontré la respuesta.Si es posible.Solo tienes que agregar un objeto personalizado como fuente de datos en Visual Studio.
Otros consejos
Nunca pude elegir uno de mis propios POCO en la configuración de Datos del informe de mi proyecto como modelo para el informe: la supuesta opción "global" mencionada en el tutorial no estaba ahí.Así que terminé teniendo que editar el XML para definir el tipo y una fuente de datos de imitación (que en realidad no existe en mi proyecto).
Asigno los datos de tipo Aies.Core.Model.Invoice.MemberInvoice
al informe en código
reportViewer.LocalReport.DataSources.Add(new ReportDataSource("MemberInvoice", new[] { invoice1 }));
Y la definición personalizada es:
<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>
Creo que puedes configurar SSRS para leer valores de datos de un objeto más o menos arbitrario. Este enlace describe el objeto IDataReaderFieldProperties en la API que (IIRC) le permite especificar el método getter a invocar para obtener un valor.