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

时间:2011-03-11 16:49:06

标签: c# rdlc report

问题

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

问题是,我想用一些数据创建一个报告(由用户输入),整点是布局,我没有大量的数据。因此,安装数据库,将数据写入数据库,然后只是为了显示报告而提取它们是非常难以理解的。

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

背景

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

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

5 个答案:

答案 0 :(得分:29)

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

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

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

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

答案 1 :(得分:11)

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

如果你看看这里:

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

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

<磷>氮

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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

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