如何在没有数据库的情况下创建报告(RDLC)?

问题

创建报表(RDLC)时,数据源似乎只是此数据库或该数据库。 有没有办法说服VS建立内存数据源的链接? 类似于WPF数据绑定的东西。

问题是,我想创建一个只有几个数据的报告(由用户输入),整点是布局,我没有大量的数据。 因此,安装数据库,将数据写入数据库,然后只是为了显示报告而获取它们是一种巨大的过度杀伤力。

所以,我正在寻找从内存数据创建报告的能力。

背景

我想设计一个布局,添加图像,设置样式,字体颜色等,并添加不超过几个参数,如“名字”,“姓氏”(用户)和“文本”。 用户将输入这3个值,获取传单并将其打印X次。 布局必须精确 – 从纸张尺寸,图像位置,字体大小等开始。

也许有比RDLC更好的解决方案,但它是内置引擎,无论我如何搜索它总是在搜索结果中弹出。

RDLC报告的数据源可以是实现IEnumerable任何内容。 如果它是对象的枚举,则对象上的属性将成为报表中的字段。

关于报告的事情是他们有自己内部的数据集概念。 在设计时,您需要为报表设计者提供要使用的数据集。 该报告在内部摄取数据集,并用于设计报告。 实际情况是报告本身并不关心实际的数据集。 它只关心它的架构。 但是,在运行时,您提供的用于满足该数据集的对象可以来自任何地方,只要它们满足相同的模式即可。

我在MS时代发布了一篇博文,展示了如何获得良好设计时支持的技巧,然后在运行时为报告提供了您想要的任何数据:

http://blogs.msdn.com/b/magreer/archive/2008/10/16/setting-the-datasource-for-a-report-at-runtime.aspx

我最近撰写了一篇关于创建报表程序集并在项目中使用它的博客文章。 我的报告接受我的类列表作为数据源,不要从DB本身读取。

如果你看看这里:

http://wraithnath.blogspot.com/2011/02/visual-studio-2010-report-viewer-object.html

它应该有所帮助。 基本上,您创建一个包含数据源的类库,因为VS 2010在检测对象数据源时存在实际问题。 它的工作时间占20%,这就是为什么我决定这样做的原因。

ñ

你绝对可以绑定到DataTables。 由于您可以手动创建DataTables,这是在没有数据库的情况下执行此操作的一种方法。

下面是一个示例,我们使用DataTables以编程方式加载RDLC控件以呈现PDF:

 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 

这是一个小配置方法之一:

 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并没有什么特别之处,但是到达这个代码function的地步可能需要一个坚实的一周。 希望这可以帮助。

您可以手动创建DataTable对象,在其中填充Columns集合,然后调用NewRow()。 获取结果并填充字段,然后将其传递给Rows.Add()。 这就是我一直在做的事情(真的不喜欢rdlc,它与html相比如此缓慢和笨重)。

返回业务对象列表并将其添加为数据源:

 ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("Report", new List { new ReportDto(businessObj) })); 

ReportDto是业务对象的包装器,其中完成了所有格式化,连接和其他报表相关的修改。 它仅发出报告所需的属性。

然后转到添加数据集并选择ReportDto的命名空间作为数据源,并选择ReportDto作为数据集。 现在,您在ReportDto中包含的所有属性都将在设计器中可用。