Comment créer un rapport (RDLC) sans base de données?
Problème
lorsque vous créez un rapport (RDLC), la source de données semble n'être que telle ou telle base de données. Y a-t-il un moyen de convaincre VS d'établir un lien vers la source de données de mémoire? Quelque chose de similaire à la Banque de données WPF.
le problème est, je voudrais créer un rapport avec juste quelques données (entrées par l'utilisateur), le point entier est layout, Je n'ai pas énorme quantité de données. Donc installer DB, écrire des données à DB, et ensuite les récupérer juste pour montrer le rapport est énorme exagéré.
donc, je cherche la capacité de créer un rapport à partir de données de mémoire.
Background
je voudrais concevoir une mise en page, Ajouter des images, des styles de jeu, des couleurs de police, etc. et n'ajoutez pas plus de quelques paramètres comme le "prénom", "nom" (de l'utilisateur) et "texte". L'utilisateur entrerait ces 3 valeurs, obtiendrait un dépliant et l'imprimerait X fois. La mise en page doit être exacte -- à partir de la taille du papier, de l'emplacement des images, de la taille des polices, etc.
peut-être là sont de meilleures solutions que RDLC mais il est intégré moteur, et peu importe comment je cherche il apparaît toujours dans les résultats de recherche.
5 réponses
la source de données pour un rapport RDLC peut être n'importe quoi qui implémente IEnumerable
. Si c'est une énumération d'objets, puis les propriétés de l'objet deviennent des champs dans le rapport.
Le truc avec les rapports, c'est qu'ils ont leur propre idée interne de ce qu'est l'ensemble de données. Au moment de la conception, vous devez fournir au concepteur de rapport avec un ensemble de données pour travailler avec. Le rapport incorpore ces données en interne et il est utilisé pour concevoir le rapport. La réalité est que le rapport lui-même ne de soins sur l'ensemble de données. Il se soucie uniquement de son schéma. Cependant, à l'exécution les objets que vous fournissez pour satisfaire que l'ensemble de données peut venir de n'importe où, aussi longtemps qu'ils satisfont ce même schéma.
j'ai un petit billet de blog de retour dans mon MS days qui montre un truc sur la façon d'obtenir une bonne prise en charge du temps de conception, et puis à runtime fournir le rapport avec toutes les données que vous veux:
j'ai récemment écrit un billet de blog sur la création d'une assemblée de reportage et son utilisation dans un projet. Mes rapports acceptent une liste de mes classes comme source de données et ne lisent pas directement à partir de la base de données.
Si vous avez un coup d'oeil ici:
http://wraithnath.blogspot.com/2011/02/visual-studio-2010-report-viewer-object.html
ça devrait aider. Fondamentalement, vous créez une bibliothèque de classe contenant les sources de données comme VS 2010 a un vrai problème de détection objet les sources de données. Il fonctionne comme 20% du temps et c'est pourquoi j'ai décidé de faire de cette façon.
N
vous pouvez certainement vous lier aux données. Puisque vous pouvez créer des DataTables à la main, c'est une façon de le faire sans base de données.
voici un exemple où nous chargeons programmatiquement un contrôle RDLC afin de rendre un PDF, en utilisant des DataTables:
Dim Viewer As New ReportViewer
Viewer.LocalReport.ReportPath = "Physicians\Patients\OrderPlacement\DownloadRx\RxPdf.rdlc"
Me.LoadReport(orderID, Viewer)
Dim Renderer As New Code.Reporting.RenderToPDF
Renderer.Save(Viewer, FileFullPath)
Et voici le contenu de LoadReport:
Private Sub LoadReport(ByVal orderID As Integer, ByVal viewer As ReportViewer)
'This is adapted from here: http://www.codeproject.com/KB/reporting-services/RDLC_and_DataSet.aspx
'--Setup
viewer.LocalReport.DataSources.Clear()
viewer.LocalReport.EnableHyperlinks = True
'--Configure DataSources
Dim DocumentData As New RxDocumentData(orderID)
Me.SetupRxPdfDataSourceHeader(DocumentData, viewer)
Me.SetupRxPdfDataSourceMetrics(DocumentData, viewer)
Me.SetupRxPdfDataSourceOrderHeader(DocumentData, viewer)
Me.SetupRxPdfDataSourceOrderItems(DocumentData, viewer)
Me.SetupRxPdfDataSourceChainOfCustody(DocumentData, viewer)
Me.SetupRxPdfDataSourcePreTreatmentWorkupOrderTags(DocumentData, viewer)
Me.SetupRxPdfDataSourceTakeHomeMedicationsOrderTags(DocumentData, viewer)
viewer.LocalReport.Refresh()
End Sub
Et voici une de ces petites méthodes de configuration:
Private Sub SetupRxPdfDataSourceHeader(ByVal data As RxDocumentData, ByVal viewer As ReportViewer)
Dim Dset_Header As New ReportDataSource("Dset_Header", data.HeaderDataTable)
viewer.LocalReport.DataSources.Add(Dset_Header)
End Sub
data.HeaderDataTable
est juste un DataTable fortement tapé que nous créons par programme et mettre les données en main.
il n'y a rien de spécial dans le DataTable, mais arriver au point où ce code était fonctionnel a probablement pris une semaine solide. Espérons que cette aide.
vous pouvez créer manuellement un objet DataTable, peupler la collection de Colonnes, puis appeler NewRow(). Prenez le résultat et remplissez les champs, puis passez-le aux lignes.Ajouter.)( C'est ce que j'ai fait (je n'aime pas vraiment rdlc, c'est tellement lent et clunky comparé à html).
retournez une liste de vos objets d'affaires et ajoutez - la comme source de données:
ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("Report", new List<ReportDto> { new ReportDto(businessObj) }));
ReportDto est un wrapper pour votre objet d'affaires où toutes les modifications de formatage, de concaténations et d'autres rapports sont effectuées. Il n'émet que les propriétés dont vous avez besoin pour le rapport.
puis allez à add data set et choisissez L'espace de nom de ReportDto comme source de données et choisissez ReportDto comme ensemble de données. Maintenant toutes les propriétés que vous avez incluses dans ReportDto seront disponibles en designer.