我们如何解决 ReportViewer 无法使用来自另一个项目的报告的问题?
How can we get around a ReportViewer's inability to use reports from another project?
我目前正在做一个大学 C# 项目,我需要应用 5 层的 N 层架构:
- 数据访问
- SQL层
- 业务层
- 桌面前端
- 网络前端
项目的需求之一是显示报告。
我选择使用 ReportViewer 和 RDLC 报告来完成这项工作。在我到达项目的最终迭代之前,我的选择一直运行良好。
在此迭代之前,我只需要从桌面应用程序生成报告,并且 RDLC 报告在我的桌面应用程序项目中。现在我需要在 ASP.Net WebForm 上生成报告。
由于报告需要由 2 个不同的项目访问,我认为我所要做的就是将 RDLC 报告向上移动一层,到我的业务层(可能本来应该在那里,哎呀)。当然,我运行成问题了。从来没有那么容易,是吗?
经过一番搜索,我发现了 2 个特别有用的 posts:
- Reportviewer and report are in different projects in the same solution. How do I attach the report to the viewer
- 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 个;因为,那是糟糕的设计。
完全清楚我的需求:
- 我需要能够访问来自 2 个不同项目的 RDLC 报告
- 我必须遵循 N 层架构并保持代码可重用
所以,这就是为什么我要问,我可以尝试什么样的解决方法来解决这个问题?
嗯,我能找到的最好的方法是将 PDF 嵌入到 WinForms 中。这似乎需要第三方 DLL,这是我一直试图避免的;因为,这是一个大学项目。
虽然还没有测试...
LocalReport.Render
方法可以作为 Byte[]
生成 PDF(以及多种内容)。如果我在业务层中使用 Render
方法;然后,我希望它能工作,因为 LocalReport
会在与 RDLC 文件相同的项目中做自己的事情,因此工作。
在那之后我应该能够简单地 return 生成的报告并在任何我想要的地方使用它。
不幸的是,我不想经历将第三方 dll 添加到大学项目的复杂性,所以我将简单地复制 RDLC 文件...讨厌这个解决方案;但是,它就是这样。
我目前正在做一个大学 C# 项目,我需要应用 5 层的 N 层架构:
- 数据访问
- SQL层
- 业务层
- 桌面前端
- 网络前端
项目的需求之一是显示报告。
我选择使用 ReportViewer 和 RDLC 报告来完成这项工作。在我到达项目的最终迭代之前,我的选择一直运行良好。
在此迭代之前,我只需要从桌面应用程序生成报告,并且 RDLC 报告在我的桌面应用程序项目中。现在我需要在 ASP.Net WebForm 上生成报告。
由于报告需要由 2 个不同的项目访问,我认为我所要做的就是将 RDLC 报告向上移动一层,到我的业务层(可能本来应该在那里,哎呀)。当然,我运行成问题了。从来没有那么容易,是吗?
经过一番搜索,我发现了 2 个特别有用的 posts:
- Reportviewer and report are in different projects in the same solution. How do I attach the report to the viewer
- 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 个;因为,那是糟糕的设计。
完全清楚我的需求:
- 我需要能够访问来自 2 个不同项目的 RDLC 报告
- 我必须遵循 N 层架构并保持代码可重用
所以,这就是为什么我要问,我可以尝试什么样的解决方法来解决这个问题?
嗯,我能找到的最好的方法是将 PDF 嵌入到 WinForms 中。这似乎需要第三方 DLL,这是我一直试图避免的;因为,这是一个大学项目。
虽然还没有测试...
LocalReport.Render
方法可以作为 Byte[]
生成 PDF(以及多种内容)。如果我在业务层中使用 Render
方法;然后,我希望它能工作,因为 LocalReport
会在与 RDLC 文件相同的项目中做自己的事情,因此工作。
在那之后我应该能够简单地 return 生成的报告并在任何我想要的地方使用它。
不幸的是,我不想经历将第三方 dll 添加到大学项目的复杂性,所以我将简单地复制 RDLC 文件...讨厌这个解决方案;但是,它就是这样。