Het instellen van de gegevensbron voor een Lokale Rapport – .NETTO & Report Viewer

Ik heb een custom control (een windows-formulier met een rapport viewer). Ik heb de volgende code voor het laden van een lokale verslag:

Opgenomen in CustomReportViewer Klasse

//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);
}

Ik noem dit met behulp van:

CustomReportViewer reportViewer = new CustomReportViewer();

Dit werkt prima en een windows-formulier wordt weergegeven met de report viewer-besturingselement maar krijg ik de volgende melding:

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

Ik ben niet helemaal zeker hoe u de gegevensbron? De gegevens die ik nodig heb is opgeslagen in een externe database…wat moet ik doen om deze verbinding?

InformationsquelleAutor user559142 | 2012-01-10



3 Replies
  1. 17

    Te maken moet u een ReportDataSource, en stel de Value eigendom – bijvoorbeeld DataTable en IEnumerables zijn ondersteunde bronnen

    Als een voorbeeld, en ervan uitgaande dat er een methode bestaat om terug te keren een DataSet, met een enkele DataTable overeenkomen met de kolommen die nodig is voor uw rapport:

    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();

    Merk op dat het vaak gemakkelijker om het gewoon te embedden van de RDLC in de gemeente, in plaats van dat te behouden aparte RDLC bestanden. Doe dit door het selecteren van de Build Action op de RDLC als Embedded Resource, en daarna kunt u de ReportEmbeddedResource eigendom:

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

    Er rekening mee dat de resource string moet de volledig gekwalificeerde naam van de bron (inclusief Montage).

    • Ook let op indien uw Bronnen worden in een Map, die de naam van de Map komt ook in de volledig gekwalificeerde naam.
  2. 8

    De sleutel was voor mij als beantwoord door StuartLC als hierboven… met verdere verduidelijking in dat wanneer hij zei dat het “Moet overeenkomen met de Gegevensbron in de RDLC”.. het eigenlijk bleek de “DataSetName” element waarde re: <DataSetName>DataSet1</DataSetName>

    Ik ging rond en rond want het is heet “DataSource”, dus ik bleef het gebruik van de Gegevensbron element naam, maar blijkbaar in de rdl en rdlc bestand dit echt betekent de DataSetName. Dus met dat in gedachten is hier de code geleend van Stuart boven met mijn eigen. Opmerking de DataSetName element waarde:

            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();
            }
  3. 0

    je kan gewoon gebruik maken van een datatable in plaats van een dataset.
    wijzig deze:

    DataSet ds = new DataSet();
    da.Fill(ds);
    DataTable dt = ds.Tables[0];

    dit:

    DataTable dt = new DataTable();
    da.Fill(dt);

    en dit:

    reportDataSource.Value = ds.Tables[0];

    deze

    reportDataSource.Value = dt;

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *