2012-01-10 11 views
8

He creado un control personalizado (un formulario de Windows con un visor de informes). Tengo el siguiente código para cargar un informe local:Configuración del origen de datos para un informe local - .NET & Report Viewer

Contenido en CustomReportViewer Clase

//Load local report 
this.reportViewer1.ProcessingMode = ProcessingMode.Local;   
//enable loading of external images   
this.reportViewer1.LocalReport.EnableExternalImages = true; 
//pass the report to the viewer 
using (FileStream stream = new FileStream(filename, FileMode.Open)) 
{ 
    this.reportViewer1.LocalReport.LoadReportDefinition(stream); 
} 

Yo llamo a esto usando:

CustomReportViewer reportViewer = new CustomReportViewer(); 

Esto funciona bien y una forma de Windows aparece que contiene el informe control de visor pero Aparece el siguiente mensaje:

A data source instance has not been supplied for the data source "ReportData" 

No estoy del todo seguro de cómo configurar la fuente de datos? Los datos que necesito se almacenan en una base de datos remota ... ¿qué debo hacer para configurar esta conexión?

Respuesta

16

Debe crear un ReportDataSource y establecer su propiedad Value - p. DataTable y IEnumerable s son supported sources

A modo de ejemplo, y suponiendo que existe un método para devolver un DataSet, con una sola DataTable coincidir las columnas necesarias por su informe:

DataSet ds = SomeMethodToRetrieveDataSet(); // e.g. via DataAdapter 
// If your report needs parameters, they need to be set ... 
ReportParameter[] parameters = new ReportParameter[...]; 

ReportDataSource reportDataSource = new ReportDataSource(); 
// Must match the DataSource in the RDLC 
reportDataSource.Name = "ReportData"; 
reportDataSource.Value = ds.Tables[0]; 

// Add any parameters to the collection 
reportViewer1.LocalReport.SetParameters(parameters); 
reportViewer1.LocalReport.DataSources.Add(reportDataSource); 
reportViewer1.DataBind(); 

Tenga en cuenta que a menudo es más fácil simplemente inserte el RDLC en su conjunto, en lugar de tener que guardar archivos RDLC separados. Para ello, seleccione el Build Action en el RDLC como Embedded Resource, y entonces se puede establecer la propiedad ReportEmbeddedResource:

reportViewer1.LocalReport.ReportEmbeddedResource = 
         "MyOrganisation.MyAssembly.NameSpace.MyReportName.rdlc"; 

Tenga en cuenta que la cadena de recursos debe incluir el nombre completo del recurso (incluido el montaje).

+0

También tenga en cuenta si sus recursos están en una carpeta, que el nombre de la carpeta también se mete en el nombre completo. – StuartLC

7

La clave para mí fue la respuesta de StuartLC como la anterior ... con más aclaraciones en cuanto a que cuando dijo "debe coincidir con DataSource en el RDLC" ... resultó ser el valor del elemento "DataSetName" re: <DataSetName>DataSet1</DataSetName>

Di vueltas y vueltas porque se llama "DataSource" así que seguí usando el nombre del elemento DataSource pero aparentemente en el archivo rdl y rdlc esto realmente significa el DataSetName. Así que teniendo esto en cuenta aquí está el código como prestado de Stuart arriba con el mío. Tenga en cuenta el valor del elemento DataSetName:

 using (SqlConnection sqlConn = new SqlConnection(rvConnection)) 
     using (SqlDataAdapter da = new SqlDataAdapter(rvSQL, rvConnection)) 
     { 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
      DataTable dt = ds.Tables[0]; 

      this.reportViewer1.Reset(); 
      this.reportViewer1.ProcessingMode = ProcessingMode.Local; 
      this.reportViewer1.LocalReport.ReportPath = AppDomain.CurrentDomain.BaseDirectory + "ssrsExport.rdlc"; 
      ReportDataSource reportDataSource = new ReportDataSource(); 
      // Must match the DataSet in the RDLC 
      reportDataSource.Name = "DataSet1"; 
      reportDataSource.Value = ds.Tables[0]; 
      this.reportViewer1.LocalReport.DataSources.Add(reportDataSource); 
      this.reportViewer1.RefreshReport(); 
     } 
Cuestiones relacionadas