我创建了一个水晶报告,并希望将其加载到ReportDocument。即.Load(路径)方法。 .rpt的构建操作是资源。 .rpt文件与尝试加载它的.vb文件位于同一文件夹中。
如果我指定直接路径,例如“C:/PhotoCrystalReport.rpt”它可以工作,但我想指定.rpt将作为资源存储的路径,然后它找不到该文件。我尝试了下面的代码,但它没有用(完全相同的东西适用于图像资源但不适用于.rpt)
Dim cryRpt As New ReportDocument
cryRpt.Load("pack://application:,,,/fstransaction;component/View/Report/PhotoCrystalReport.rpt")
也尝试了,
cryRpt.Load("PhotoCrystalReport.rpt")
那么,有什么方法可以指出这个.rpt作为资源的位置吗?
答案 0 :(得分:0)
我遇到了同样的问题,并在此链接中找到了解决方案:
how to deploy WPF application having Crystal Report
string reportPath = System.IO.Path.Combine(Environment.CurrentDirectory, "MyReport.rpt");
MyReport.rpt文件的属性,然后选择“始终复制”或“如果较新则复制”。
答案 1 :(得分:0)
那么,有什么方法可以指向这个.rpt的位置作为资源吗?
否。
我最近也遇到过同样的问题,但据我所知,只有一种加载报表的方法-CrystalDecisions.CrystalReports.Engine.ReportDocument.Load()。此函数将文件名作为字符串,并且不会在程序集中查找嵌入式资源。
因此,您有两个选择:
从外部保存报告(即,将“构建操作”设置为“其他文件”,并将“复制到输出目录”设置为“始终复制”或“如果更新则复制”),并按设计使用Load() 。这是大多数在线示例建议您继续的方式。
将报告提取到一个临时文件中,然后对该文件进行Load()。完成报告后,请不要忘记清理临时文件。有关如何执行此操作的信息很多:
这是我的做法:
var temp = System.IO.Path.GetTempFileName();
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var stream = assembly.GetManifestResourceStream(@"Report.rpt");
using (var fout = System.IO.File.Create(temp))
{
stream.CopyTo(fout);
}
,然后再执行以下操作:
if ((null != temp) && (System.IO.File.Exists(temp)))
{
System.IO.File.Delete(temp);
}
要获取标识报告名称的字符串,我在调试会话的中间使用了Visual Studio Instant窗口。创建汇编变量并运行后,我立即设置了一个断点:
? assembly.GetManifestResourceNames()