2015-07-21 83 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'控件。但是,如果我嘗試拖動頁眉內的子報表,它不會移動。我認爲在報告標題中不能包含子報表... –