Lorsque vous créez un rapport (RDLC), la DataSource semble être que cette base de données ou cette base de données. Y a-t-il un moyen de convaincre VS d'établir un lien vers la source de données de la mémoire? Quelque chose de similaire à WPF Databinding.
Le problème est que je voudrais créer un rapport avec juste quelques données (entrées par l'utilisateur), tout le point est la mise en page, je n'ai pas une quantité massive de données. Ainsi installer dB, écrire des données à DB, puis les récupérer juste pour montrer que le rapport est énorme.
Donc, je cherche la possibilité de créer un rapport de données de mémoire.
Je souhaite concevoir une mise en page, ajouter des images, définir des styles, des couleurs de police, etc. et ajouter plus de quelques paramètres comme "Prénom", "Nom" (de l'utilisateur) et "Texte". L'utilisateur entrerait ces 3 valeurs, obtenez un dépliant et imprimez-le x fois. La mise en page doit être exacte - à partir de la taille du papier, de la mise en place d'images, de la taille des polices, etc.
Peut-être qu'il y a de meilleures solutions que RDLC, mais c'est un moteur intégré, et peu importe la façon dont je cherche, il apparaît toujours dans les résultats de la recherche.
Le DataSource pour un rapport RDLC peut être tout ce qui implémente IEnumerable
. S'il s'agit d'une énumération d'objets, les propriétés de l'objet deviennent des champs dans le rapport.
La chose à propos des rapports est qu'ils ont leur propre notion interne de ce que l'ensemble du jeu de données est. Au moment de la conception, vous devez fournir le concepteur de rapports avec un jeu de données avec lequel travailler. Le rapport ingère que le jeu de données interne et il est utilisé pour concevoir le rapport. La réalité est le rapport lui-même ne se soucie pas de l'ensemble de données. Il ne se soucie que de son schéma. Cependant, au moment de l'exécution des objets que vous fournissez pour satisfaire que le jeu de données peut provenir de n'importe où, à condition de satisfaire au même schéma.
J'ai un petit message de blog de retour dans mes jours MS qui montre une astuce sur la manière de bénéficier d'un bon soutien du temps de conception, puis à l'exécution fournit le rapport avec toutes les données souhaitées:
J'ai récemment écrit un article de blog sur la création d'un assemblage de reporting et l'utiliser dans un projet. Mes rapports acceptent une liste de mes classes en tant que DataSource et ne lisez pas les DB eux-mêmes.
Si vous avez un look ici:
http://wraithnath.blogspot.com/2011/02/visual-studio-2010-report-viewer-object.html
cela devrait aider. Fondamentalement, vous créez une bibliothèque de classe contenant les fichiers DataSources comme VS 2010 a un véritable problème de détection de données de l'objet. Cela fonctionne comme 20% du temps, c'est pourquoi j'ai décidé de le faire de cette façon.
N
Vous pouvez certainement se lier à des datables. Puisque vous pouvez créer des datables à la main, c'est un moyen de le faire sans base de données.
Voici un exemple où nous chargons de manière programmable une commande RDLC afin de rendre un PDF, à l'aide de datables:
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 jeu de données fortement tapagé que nous créons par la main et mettez des données à la main.
Il n'y a rien de spécial sur le jeu de données, mais d'arriver au point où ce code était fonctionnel a probablement pris une solide semaine. J'espère que cela t'aides.
Vous pouvez créer manuellement un objet DataTable, peupler la collection de colonnes là-bas, puis appelez Newrow (). Prenez le résultat de cela et remplissez les champs, puis transmettez-le aux lignes.add (). C'est ce que j'ai fait (Vraiment n'aime pas RDLC, c'est si lent et clunky comparé au HTML).
Renvoie une liste de vos objets métier et ajoutez-le comme source de données:
ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("Report", new List<ReportDto> { new ReportDto(businessObj) }));
ReportDTo est une enveloppe pour votre objet commercial où toutes les modifications de formatage, de concaténation et d'autres rapports sont effectuées. Il n'émet que les propriétés dont vous avez besoin pour le rapport.
Ensuite, accédez à Ajouter des données et sélectionnez l'espace de noms de ReptDto en tant que source de données et sélectionnez ReportDo en tant que jeu de données. Maintenant, toutes les propriétés que vous avez incluses dans ReptDto seront disponibles dans le concepteur.