我们如何解决 ReportViewer 无法使用来自另一个项目的报告的问题?

How can we get around a ReportViewer's inability to use reports from another project?

我目前正在做一个大学 C# 项目,我需要应用 5 层的 N 层架构:

项目的需求之一是显示报告。

我选择使用 ReportViewer 和 RDLC 报告来完成这项工作。在我到达项目的最终迭代之前,我的选择一直运行良好。

在此迭代之前,我只需要从桌面应用程序生成报告,并且 RDLC 报告在我的桌面应用程序项目中。现在我需要在 ASP.Net WebForm 上生成报告。

由于报告需要由 2 个不同的项目访问,我认为我所要做的就是将 RDLC 报告向上移动一层,到我的业务层(可能本来应该在那里,哎呀)。当然,我运行成问题了。从来没有那么容易,是吗?

经过一番搜索,我发现了 2 个特别有用的 posts:

  1. Reportviewer and report are in different projects in the same solution. How do I attach the report to the viewer
  2. https://forum.inductiveautomation.com/t/displaying-a-report-over-multiple-projects/12825

第一个 post 告诉我我需要做的就是将我的 RDLC 文件的 Copy to Output Directory 设置为 Copy always 然后将 ReportViewer.LocalReport.ReportPath 设置为rdlc 的文件名,扩展名为 ("example.rdlc").

不幸的是,这个答案对我和 OP 都不起作用。为什么它不起作用在第二个 post 中进行了解释:

A report viewer cannot view a report from another project, although this may make a good feature request. - adam.morales

然后我尝试了一些不同的东西。我为什么不在我的业务层中创建一个 属性 而不是从另一个项目使用 ReportPath 访问报告,这将 return 一个已经有报告的 LocalReport定义? 不幸的是,ReportViewer.LocalReport 是只读的。即使它是可写的,如果它没有解决问题,我也不会感到惊讶;因为,ReportPath 是一个字符串,当 LocalReport 尝试呈现时可能会出现此问题。

这对我来说是一个很大的问题。没有足够的时间完全重做报告,我不想求助于 2 个不同的 RDLC 文件,每个前端项目 1 个;因为,那是糟糕的设计。

完全清楚我的需求:

所以,这就是为什么我要问,我可以尝试什么样的解决方法来解决这个问题?

嗯,我能找到的最好的方法是将 PDF 嵌入到 WinForms 中。这似乎需要第三方 DLL,这是我一直试图避免的;因为,这是一个大学项目。

虽然还没有测试... LocalReport.Render 方法可以作为 Byte[] 生成 PDF(以及多种内容)。如果我在业务层中使用 Render 方法;然后,我希望它能工作,因为 LocalReport 会在与 RDLC 文件相同的项目中做自己的事情,因此工作。

在那之后我应该能够简单地 return 生成的报告并在任何我想要的地方使用它。

不幸的是,我不想经历将第三方 dll 添加到大学项目的复杂性,所以我将简单地复制 RDLC 文件...讨厌这个解决方案;但是,它就是这样。