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

23

问题

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

问题在于,我想创建一个仅包含少量数据(由用户输入)的报表,整个重点在于布局,我没有大量的数据。因此,安装数据库,将数据写入数据库,然后获取它们以显示报表是巨大的过度杀伤力。

因此,我正在寻找从内存数据创建报表的能力。

背景

我想设计一个布局,添加图片,设置样式,字体颜色等,仅添加几个参数,例如“名”,“姓”(用户的),以及“文本”。用户会输入这3个值,获得一张传单并打印X次。 布局必须精确--从纸张大小开始,图像的放置,字体大小等等。

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

5个回答

30

RDLC报表的数据源可以是任何实现了 IEnumerable 接口的东西。如果它是一个对象的枚举,那么对象上的属性将成为报表中的字段。

关于报表的事情是,它们有自己内部的数据集概念。在设计时,您需要向报表设计器提供一个要使用的数据集。报表会在内部接受该数据集并用其来设计报表。实际上,报表本身并不关心实际的数据集。它只关心它的模式。但是,在运行时,只要提供的对象满足相同的模式,这些对象可以来自任何地方,以满足该数据集。

我在我的MS日子里写了一篇小博客,介绍了如何获得良好的设计时支持,并在运行时提供所需数据的技巧:

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

更新 自此之后,Microsoft已删除了我的博客,但我在wayback机器中找到了它

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


11

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

如果您看一下这里:

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

它应该会有所帮助。基本上,您需要创建一个包含数据源的类库,因为VS 2010有一个实际问题,即检测对象数据源时只有20%的准确率,这就是我决定采用这种方式的原因。

N


谢谢,当你已经知道答案时,“启蒙”的道路看起来很明显;-)“为什么我没有想到那个”。感谢您的帖子(和博客),我标记了Matt的答案作为THE答案,因为解决方案的完整性。 - greenoldman
嘿,没问题,我刚刚看了他的帖子,比我的容易理解多了 :) 希望我们能为你节省一些时间。我至少花了几天时间来解决这个问题! - WraithNath
非常感谢您分享知识!再次感谢! - greenoldman

2
你绝对可以绑定到DataTables。由于你可以手动创建DataTables,因此这是一种在没有数据库的情况下完成此操作的方法。
以下是一个示例,我们通过编程方式加载RDLC控件以渲染PDF,使用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)

这里是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 没有什么特别之处,但要让这段代码正常运行可能需要花费一个星期的时间。希望这能有所帮助。


1
非常感谢。在WraithNath和Matt的回答之后,我发现我错过了将数据集(作为项目的VS项)添加到这里的关键步骤。 - greenoldman

1
你可以手动创建一个 DataTable 对象,填充其中的 Columns 集合,然后调用 NewRow() 方法。将其结果填充字段,然后传递给 Rows.Add() 方法。这就是我一直在做的(真的不喜欢 rdlc,与 html 相比太慢且笨重)。

非常感谢。在WraithNath和Matt的回答之后,我意识到我错过了将数据集(作为项目的VS项)添加到这里的关键步骤。 - greenoldman

0

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

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

ReportDto是一个包装器,用于包装你的业务对象,并在其中进行所有格式化、串联和其他报表相关的修改。它仅发出报表所需的属性。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接