C# 如何在多个RDLC报告上共享和嵌入图像

C# 如何在多个RDLC报告上共享和嵌入图像,c#,reporting-services,rdlc,embedded-resource,C#,Reporting Services,Rdlc,Embedded Resource,我创建了一个MDI应用程序,它在不同的子窗体上显示一些DataGridView,这些子窗体被视为单独的应用程序,因为它们可以访问不同的数据库 这些数据需要以PDF报告的形式导出。我在一个新的MDI子窗体中使用了ReportViewer组件,并在解决方案上创建了一个新项目,该项目仅包含RDLC报表文件作为嵌入资源,与每个应用程序关联。出于安全原因,这样做是为了避免在包含每个.RDLC文件的程序文件夹中有一个用户可访问的文件夹 这是VS解决方案的文件/文件夹结构: Solution | |_ Cla

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

这些数据需要以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
    |_ ...
所有的工作都很好,但现在我需要通过插入一个徽标来定制我的所有报告,所以需要一个图像。所以我需要在每个报告中添加相同的图像

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

  • “嵌入”:仅通过将图像嵌入到单个报告文件中来工作。但在我的情况下,由于存储浪费,这不是一个有效的解决方案
  • “外部”:通过指定URL或路径(我想做的事)
  • “数据库”:指定包含图像的数据库字段
通过使用Reports.dll库作为源,使用“folder.filename”语法,在ReportViewer窗口中引用并加载.rdlc文件

因此,如果要创建包含图像的文件夹:

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

  • 您可以执行以下操作

    在报告的图像属性中

  • 图像来源:嵌入式
  • 单击导入按钮并加载图像
  • 通过这种方式,RDLC将图像保存为文件RDLC中的base64,您可以通过从解决方案资源管理器窗格中使用xml编辑器打开来查看,而无需担心图像的位置

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

  • 图片来源:数据库
  • 使用此字段:[YourPropertyName]
  • 使用此MIME类型:图像/jpeg
  • 在报表数据集中,添加名为YourPropertyName的byte[]列或属性
  • 最后一点注意,如果徽标在您所有的报表中都是通用的,建议添加名为header的子报表,该子报表包含此徽标,并将其放在您拥有的每个报表中。这样,如果以后要更改徽标,只需在该header子报表中更改即可

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


    希望这能帮助您

    在每个报表中嵌入图像不是一个好的解决方案。数据库解决方案对我的案例也无效。您上次建议使用子报表作为标题可能是有效的,但我应该如何实现它?我创建了一个新的报告,并在其中添加了徽标图像。但是我无法从其他报表中引用它…@CheshireCat从工具箱拖放子报表并将其放置在目标报表中,然后右键单击此子报表对象(灰色)=>子报表属性,然后将报表的名称放入“HeaderReport”例如,在“名称”和“将此报表用作子报表”文本框下,您不知道我不知道子报表的组件!无论如何,我的报告有一个页眉,其中包含徽标、标题、副标题和页码/总页数。如果我理解正确,
    子报表
    应该像
    面板
    一样使用,其中包含所有这些
    文本框
    图像
    控件。但是,如果我尝试将子报表拖到页眉内,它不会移动。我认为不可能在报表标题中包含子报表…不,此子报表组件您将配置它链接到包含图像和标题的报表,要创建此链接,您应该为此子报表提供包含标题内容的报表的名称,并在添加该组件后执行此操作,右键单击它并转到子报表属性,然后将包含图像、标题和页数的报表的名称放在两个文本框中(名称,将此报表用作子报表),如前所述comment@CheshireCat,从页眉中删除内容并将其放入单独的报表中,例如,将其称为HeaderReport,将子报表组件放入页眉中,并按照我前面提到的操作,将此组件链接到HeaderReport.rdlc,在文本框中,不要将扩展名(.rdlc)仅仅放在名称上
    /* 
     * 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();