2015-07-21 59 views
2

我创建了一个MDI应用程序,该应用程序在不同的子窗体上显示一些DataGridViews,因为它们可以访问不同的数据库,所以它们被视为单独的应用程序。如何在许多RDLC报告上共享和嵌入图像

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

这是VS的解决方案的文件/文件夹结构:

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文档似乎有是用于图像3种可能的来源:

  • “嵌入式”:仅通过嵌入单个报告文件中的形象工程。但在我的情况下,由于浪费存储空间,这不是一个有效的解决方案。
  • “外部”:通过指定URL或路径(我想要做的)
  • “数据库”:指定包含图像的数据库字段。

.rdlc文件在ReportViewer窗口中被引用并加载,通过使用Reports.dll库作为源文件使用“folder.filename”语法。

/* 
* 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. 如何在调试模式和发布模式下保持对文件夹和图像的引用,以便将程序安装到用户客户端时?

回答

2

你可以在报告中

  1. 图像源的图像性能以下

    :嵌入式

  2. 点击导入按钮,加载图像

在这方式,RDLC会将图像保存为base64内部的文件rdlc,您可以使用xml编辑器从解决方案中打开查看ex plorer窗格,而且不需要担心图像的位置。

另一种方式,如果你想从数据库例如加载图像,你可以做以下

  1. 图片来源:数据库
  2. 使用此字段:[YourPropertyName]
  3. 使用此MIME类型:在报告中的数据集的图像/ JPEG
  4. ,添加一个字节[]柱或属性调用YourPropertyName

最后注意,如果徽标在所有报告中都很常见,建议添加包含此徽标的子报表,并在每个报告中放入,这样,如果您想稍后更改徽标,则可以只需要在该报头子报表中更改它。

您可以查看此demo我准备向您展示如何实现这一目标(到头部报告添加到您的当前报告)

希望这将帮助你

+0

嵌入每个报告内的图像是不是一个好的解决方案数据库解决方案对我来说也是无效的。你最后一个关于作为头部使用的子报表的建议可能是有效的,但我应该如何实现呢?我创建了一个新报告并添加了该徽标图像。但后来我无法从其他报告中引用它... –

+0

@CheshireCat从工具箱中拖放子报表并将其放置在目标报表中,然后右键单击此子报表对象(灰色)=>子报表属性,然后将名称报告“HeaderReport”例如在名称下并将此报告用作子报告文本框,并且您已完成 – Monah

+0

我不知道“Subreport”组件!无论如何,我的报告有一个页眉,其中包含标志,标题,副标题和页面/总数。如果我理解正确,'Subreport'应该像'Panel'一样使用,它包含所有这些'TextBox'和'Image'控件。但是,如果我尝试拖动页眉内的子报表,它不会移动。我认为在报告标题中不能包含子报表... –