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

C# 如何在没有数据库的情况下创建报告(RDLC)? 问题,c#,rdlc,report,C#,Rdlc,Report,创建报表(RDLC)时,数据源似乎只是这个或那个数据库。有没有办法说服VS建立到内存数据源的链接?类似于WPF数据绑定的东西 问题是,我想创建一个只有少量数据(由用户输入)的报告,重点是布局,我没有大量的数据。因此,安装数据库,将数据写入数据库,然后获取它们,只是为了显示报告是一个巨大的过度消耗 因此,我正在寻找从内存数据创建报告的能力 背景 我想设计一个布局,添加图像,设置样式,字体颜色等,并添加不超过几个参数,如“名字”,“姓氏”(用户)和“文本”。用户将输入这3个值,得到一份传单并打印X次

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

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

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

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


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

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

您完全可以绑定到DataTables。因为您可以手工创建数据表,所以这是一种不用数据库的方法

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

Dim查看器作为新的ReportViewer
Viewer.LocalReport.ReportPath=“医师\患者\医嘱放置\下载rx\RxPdf.rdlc”
Me.LoadReport(orderID,查看器)
将渲染器变暗为新代码。Reporting.RenderToPDF
Renderer.Save(查看器,FileFullPath)
以下是LoadReport的内容:

Private Sub-LoadReport(ByVal orderID为整数,ByVal查看器为ReportViewer)
“这是从这里改编的:http://www.codeproject.com/KB/reporting-services/RDLC_and_DataSet.aspx
--设置
viewer.LocalReport.DataSources.Clear()
viewer.LocalReport.EnableHyperlinks=True
“--配置数据源
Dim DocumentData作为新的RxDocumentData(orderID)
Me.SetupRxPdfDataSourceHeader(DocumentData,查看器)
Me.SetupRxPdfDataSourceMetrics(DocumentData,查看器)
Me.SetupRxPdfDataSourceOrderHeader(DocumentData,查看器)
Me.SetupRxPdfDataSourceOrderItems(DocumentData,查看器)
Me.SetupRxPdfDataSourceChainOfCustody(DocumentData,查看器)
Me.setuprXPDFDataSourcePreventionWorkupOrderTags(DocumentData,查看器)
Me.setuprxpdfdatasourcetakehomedicinationsordertags(DocumentData,查看器)
viewer.LocalReport.Refresh()
端接头
这里有一个小的配置方法:

专用子设置RXPDFDataSourceHeader(ByVal数据作为RxDocumentData,ByVal查看器作为ReportViewer)
将Dset_头作为新报表数据源(“Dset_头”,data.HeaderDataTable)进行调整
viewer.LocalReport.DataSources.Add(Dset\u头)
端接头
data.HeaderDataTable
只是一个强类型的数据表,我们通过编程方式创建它并手动将数据放入其中


DataTable并没有什么特别之处,但要实现这段代码的功能可能需要整整一周的时间。希望这能有所帮助。

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

如果您在此处查看:

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


N

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

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

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

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

更新微软已经删除了我的博客,但我在wayback机器上找到了它


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

ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("Report", new List<ReportDto> { new ReportDto(businessObj) }));
ReportViewer.LocalReport.DataSources.Add(newreportdatasource(“Report”,newlist{newreportdto(businessObj)}));
ReportDto是业务对象的包装器,在其中完成所有格式化、连接和其他与报表相关的修改。它只发出报告所需的属性


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

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