レポート(RDLC)を作成すると、データソースはこれまたはそのデータベースのみのようです。メモリデータソースへのリンクを確立するようにVSを説得する方法はありますか? WPFデータバインディングに似たもの。
問題は、少数のデータ(ユーザーが入力したもの)だけでレポートを作成したいということです。全体のポイントはレイアウトであり、大量のデータがありません。そのため、DBをインストールし、データをDBに書き込んでから、レポートを表示するためだけにデータをフェッチするのは、やりすぎです。
だから、私はメモリデータからレポートを作成する機能を探しています。
レイアウトのデザイン、画像の追加、スタイル、フォントの色の設定などを行い、「ユーザー」の「名」、「姓」、「テキスト」などのパラメーターをいくつか追加します。ユーザーはこれらの3つの値を入力し、チラシを入手してX回印刷します。レイアウトは正確でなければなりません-用紙サイズ、画像の配置、フォントのサイズなどから始めます。
RDLCより優れたソリューションがあるかもしれませんが、それは組み込みのエンジンであり、どのように検索しても、常に検索結果に表示されます。
RDLCレポートのデータソースは、IEnumerable
を実装するものであれば何でもかまいません。オブジェクトの列挙の場合、オブジェクトのプロパティはレポートのフィールドになります。
レポートに関することは、データセットが何であるかについて独自の内部概念を持っていることです。設計時には、使用するデータセットをレポートデザイナーに提供する必要があります。レポートはそのデータセットを内部的に取り込み、レポートの設計に使用されます。実際には、レポート自体は実際のデータセットを気にしません。スキーマのみを考慮します。ただし、実行時に、そのデータセットを満たすために提供するオブジェクトは、同じスキーマを満たす限り、どこからでも取得できます。
私のMS時代の小さなブログ投稿で、優れた設計時サポートを取得する方法のトリックを示し、実行時に必要なデータをレポートに提供します。
私は最近、レポートアセンブリの作成とプロジェクトでの使用に関するブログ投稿を書きました。レポートは、クラスのリストをデータソースとして受け入れ、DB自体からは読み取りません。
ここを見れば:
http://wraithnath.blogspot.com/2011/02/visual-studio-2010-report-viewer-object.html
それは役立つはずです。基本的に、VS 2010がオブジェクトデータソースの検出に実際の問題を抱えているため、データソースを含むクラスライブラリを作成します。それは時間の20%のように動作するので、私はこのようにすることに決めました。
N
DataTablesに確実にバインドできます。 DataTableは手動で作成できるため、データベースなしでこれを行う1つの方法です。
DataTablesを使用して、PDFをレンダリングするためにRDLCコントロールをプログラムで読み込む例を次に示します。
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)
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
そして、ここにそれらの小さな設定方法の1つがあります:
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
は厳密に型指定されたDataTableであり、プログラムで作成し、データを手動で挿入します。
DataTableについて特別なことは何もありませんが、このコードが機能するようになるまでには、おそらく一週間かかりました。お役に立てれば。
DataTableオブジェクトを手動で作成し、そこにColumnsコレクションを設定してから、NewRow()を呼び出すことができます。その結果を取得してフィールドに入力し、それをRows.Add()に渡します。それは私がやってきたことです(実際にはrdlcは好きではありません。htmlに比べて非常に遅くて不格好です)。
ビジネスオブジェクトのリストを返し、それをデータソースとして追加します。
ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("Report", new List<ReportDto> { new ReportDto(businessObj) }));
ReportDtoは、すべてのフォーマット、連結、およびその他のレポート関連の変更が行われるビジネスオブジェクトのラッパーです。レポートに必要なプロパティのみを出力します。
次に、データセットを追加し、データソースとしてReportDtoの名前空間を選択し、データセットとしてReportDtoを選択します。これで、ReportDtoに含めたすべてのプロパティがデザイナーで使用できるようになります。