在我的winform应用程序中获取rdlc报告的相对路径

我将在月末流程中自动从一些报告中创建PDF。 我遇到了ReportViewer.LocalReport无法找到我的报告的问题。 在项目中,报告文件位于“(项目根文件夹)/Reports/report.rdlc”中。

如何设置ReportViewer.LocalReport.ReportPath以便我可以引用我的报告文件? 我宁愿不设置完整路径,因为我不知道在客户端计算机上安装它将在何处安装。

使用Application.StartupPath属性,它始终指向EXE所在的目录:

  using System.IO; ... string exeFolder = Application.StartupPath; string reportPath = Path.Combine(exeFolder, @"Reports\report.rdlc"); 

您需要确保将报告复制到bin \ Debug \ Reports文件夹中,以便它可以在IDE中运行。 在构建后事件中使用xcopy / s / d来获取复制的文件。

该路径始终相对于您的“当前目录”,在大多数情况下,它是exe文件更改rdlc文件,以便将它们复制到目标文件夹而不是嵌入到资源中(通常就是这样做)。 项目中的路径无关紧要。

您可以将报告存储在“资源”文件中,并且通过使用嵌入了“资源”文件的给定.dll / .exe的汇编读取器,可以将其读作流式参考。 然后将报表设置为嵌入流以获取报表定义。

特别说明。 如果报表具有嵌套的子报表,则报表将失败,除非您还在LocalReport子报表定义中设置了对子报表.rdlc文件的另一个此类引用。

据我所知,这是来自Windows XP的错误。 该问题并未出现在Windows 7上。

所有上述答案都有效,但我有一个更正。

一旦您使用SaveFileDialog看起来像更改当前应用程序的路径,此问题就会出现。 当您使用当前路径时,会发生这种情况,相对于当前wokring目录,这是加载RDLC的默认目录,即reportpath = "nameOfReport.rldc" 。 如果要在使用SaveFileDialog后刷新报表,则reportviewer无法找到报表文件的路径。

解决方案来自Hans Passant上面的post,但我会改变这一点

 string exeFolder = Path.GetDirectoryName(Application.StartupPath); 

对此

 string exeFolder = Path.GetDirectoryName(Application.ExecutablePath); 

谢谢汉斯