如何在许多RDLC报表上共享和嵌入图像

本文关键字:共享 图像 报表 许多 RDLC | 更新日期: 2023-09-27 18:03:45

我创建了一个MDI应用程序,它显示了不同子窗体上的一些DataGridViews,这些子窗体被认为是单独的应用程序,因为它们可以访问不同的数据库。

这些数据需要导出为PDF报告。我在一个新的MDI子表单中使用了ReportViewer组件,并在解决方案上创建了一个新项目,该项目只包含作为嵌入式资源的RDLC报告文件,并与每个应用程序相关联。这样做是为了避免在包含每个. rdlc文件的程序文件夹中有一个用户可访问的文件夹,出于安全原因。

这是VS Solution的文件/文件夹结构:

Solution
|
|_ Classes
| |
| |_ Library Project that contains all the classes used for Data Access...
|
|_ MDIMain
| |
| |_ The main application Project that contains some Core Classes and Forms...
|
|_ Reports (A DLL project that doesn't contain .cs code files, but only folders and RDLC reports)
  |
  |_ App1
  | |
  | |_ Report1.rdlc
  | |_ Report2.rdlc
  | |_ ...
  |
  |_ App2
    |
    |_ Report1.rdlc
    |_ ...

一切都很好,但现在我需要自定义我所有的报告插入一个标志,所以一个图像。因此,我需要为每个报告添加相同的图像。

查看MSDN文档,似乎有三种可能的图像来源:

  • "Embedded":仅通过将图像嵌入到单个报表文件中来工作。但在我的情况下,这不是一个有效的解决方案,由于浪费存储。
  • "外部":通过指定URL或路径(我想做的)
  • "数据库":指定包含图像的数据库字段。

.rdlc文件在ReportViewer窗口中被引用和加载,通过使用Reports.dll库作为源,使用"文件夹"。文件名"语法。

/* 
 * reportSource variable is calculated dynamically with the selection on a ComboBox
 * that let the use choose a specific report.
 * The source format is like this: "Reports.AppNameFolder.Report1.rdlc"
 */
string reportSource = cmbReport.SelectedValue.ToString();
ReportDataSource rds = new ReportDataSource("");
rds.Name = "DataSet";
rds.Value = _reportDataTable;
Assembly assembly = Assembly.LoadFrom("Reports.dll");
UnmanagedMemoryStream reportStream = (UnmanagedMemoryStream)assembly.GetManifestResourceStream(reportSource);
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.LoadReportDefinition(reportStream);
reportViewer1.LocalReport.DataSources.Add(rds);
reportViewer1.RefreshReport();

那么,如果我想创建一个包含我的图像的文件夹:

  1. 我应该把它放在哪里,然后确定文件夹与主项目的输出一起生成?
  2. 如何保持对文件夹和图像的引用同时处于调试模式和发布模式,以便何时将程序安装在用户客户端中?

如何在许多RDLC报表上共享和嵌入图像

您可以执行以下操作

报告的图像属性

  1. 图片来源:嵌入式
  2. 点击导入按钮加载图片

这样,RDLC将图像保存为base64文件中的RDLC,您可以在解决方案资源管理器窗格中使用xml编辑器打开查看,而无需担心图像的位置。

另一种方式例如,如果您想从数据库加载图像,您可以执行以下操作

  1. 图片来源:数据库
  2. 使用此字段:[YourPropertyName]
  3. 使用这个MIME类型:image/jpeg
  4. 在报告数据集中,添加一个byte[]列或名为YourPropertyName
  5. 的属性

最后注释,如果徽标在您拥有的所有报告中都是通用的,建议添加名为header的子报告,该子报告包含此徽标,并将其放在您拥有的每个报告中,这样如果您以后想要更改徽标,您只需要在header子报告中更改它。

您可以查看我准备的演示,向您展示如何实现这一点(向当前报告添加标题报告)

希望这对你有帮助