2008-10-31 16 views
38

Ho un rapporto che viene utilizzato da un servizio di Windows e di un modulo di domanda. Quindi, voglio inserire il report in un file DLL che può essere utilizzato da entrambi.rapporto di visualizzazione .RDLC incorporato in un file DLL

Il problema è che se provo a impostare la proprietà ReportEmbeddedResource di un controllo di ReportViewer nella mia app di Windows form, cercherà l'app di Windows Form per la risorsa, non il file dll.

es .: codice dal modulo di Windows app:

rv.LocalReport.ReportEmbeddedResource = "MyReportInMyDLLFile.rdlc" 

Come posso fare il look comando precedente per la risorsa incorporata nel mio file DLL?

risposta

53

Qualcosa del genere dovrebbe farlo:

Assembly assembly = Assembly.LoadFrom("Reports.dll"); 
Stream stream = assembly.GetManifestResourceStream("Reports.MyReport.rdlc"); 
reportViewer.LocalReport.LoadReportDefinition(stream); 
+8

Ti amo per questo. –

+1

Quando uso il codice sopra nella 'pagina dell'applicazione' in SharePoint 2010, dopo errore sollevato:' Impossibile caricare file o assembly 'file: /// c: \ windows \ system32 \ inetsrv \ Reports.dll' o una delle sue dipendenze . Il sistema non riesce a trovare il file specificato., Ma funziona nelle applicazioni WinForm. – Amir

+0

Una risposta così vecchia ... ma funziona altrettanto bene come oggi! Ho seguito le risposte di seguito .. dove ho un report in un altro assembly all'interno di due cartelle, e semplicemente non ha funzionato, e sì era una risorsa incorporata. L'ho copiato e incollato nella seconda riga di questa risposta, e ha funzionato! – sksallaj

10

Probabilmente la cosa migliore da fare sarebbe quella di ottenere un flusso verso la risorsa RDLC dall'altro gruppo, quindi passarlo al metodo "LoadReportDefinition" del controllo Visualizzatore report.

dettagli su come ottenere un flusso da una risorsa incorporata in un assembly diverso può essere trovato qui: Retrieving Resources with the ResourceManager Class

Inoltre, è necessario fare riferimento alla risorsa incorporata usando il suo percorso completo dello spazio dei nomi.

E.g. se si dispone di un'applicazione con un namespace di default di theApp, e si mantiene un rapporto chiamato "MyReport.rdlc" in una cartella denominata "Reports", la chiamata di riferimento relazione sarà: -

rv.LocalReport.ReportEmbeddedResource = "TheApp.Reports.MyReport.rdlc"; 
22

Basta usare il pieno spazio dei nomi del gruppo, i nomi quindi cartella, quindi il nome del file:

rv.LocalReport.ReportEmbeddedResource = 
    "My.Assembly.Namespace.Folder1.Folder2.MyReport.rdlc"; 

quindi assicurarsi che il file di report è impostato come una risorsa incorporata utilizzando il riquadro proprietà.

+1

La parte folder1.folder2 era critica. Grazie! – Jake

+4

Non ne sono abbastanza sicuro, ma immagino che funzioni solo se il report si trova nello stesso assembly in cui si trova questo codice. –

+0

@ GuillermoGutiérrez hai ragione: il report può leggere l'RDLC incorporato solo nello stesso assembly, altrimenti genererà un'eccezione "Non ci sono definizioni con nome MyNamespace.MyReport.rdlc" –