Switching DataSources on a ReportViewer in WinForms

Posted by Mike Wills on Stack Overflow See other posts from Stack Overflow or by Mike Wills
Published on 2010-05-17T20:09:17Z Indexed on 2010/05/18 13:30 UTC
Read the original article Hit count: 818

Filed under:
|
|
|

I have created a winform for the users to view view the many reports I am creating for them. I have a drop down list with the report name which triggers the appropriate fields to display the parameters. Once those are filled, they press Submit and the report appears. This works the first time they hit the screen. They can change the parameters and the ReportViewer works fine. Change to a different report, and the I get the following ReportViewer error:

An error occurred during local report processing.
An error has occurred during the report processing.
A data source instance has not been supplied for the data source "CgTempData_BusMaintenance".

As far as the process I use:

  1. I set reportName (string) the physical RDLC name.
  2. I set the dataSource (string) as the DataSource Name
  3. I fill a generic DataTable with the data for the report to run from.
  4. Make the ReportViewer visible
  5. Set the LocalReport.ReportPath = "Reports\\" = reportName;
  6. Clear the LocalReport.DataSources.Clear()
  7. Add the new LocalReport.DataSources.Add(new ReportDataSource(dataSource, dt));
  8. RefreshReport() on the ReportViewer.

Here is the portion of the code that setups up and displays the ReportViewer:

/// <summary>
/// Builds the report.
/// </summary>
private void BuildReport()
{
    DataTable dt = null;
    ReportingCG rcg = new ReportingCG();

    if (reportName == "GasUsedReport.rdlc")
    {
        dataSource = "CgTempData_FuelLog";
        CgTempData.FuelLogDataTable DtFuelLog = rcg.BuildFuelUsedTable(fromDate, toDate);
        dt = DtFuelLog;
    }
    else if (reportName == "InventoryCost.rdlc")
    {
        CgTempData.InventoryUsedDataTable DtInventory;
        dataSource = "CgTempData_InventoryUsed";
        DtInventory = rcg.BuildInventoryUsedTable(fromDate, toDate);
        dt = DtInventory;
    }
    else if (reportName == "VehicleMasterList.rdlc")
    {
        dataSource = "CgTempData_VehicleMaster";
        CgTempData.VehicleMasterDataTable DtVehicleMaster = rcg.BuildVehicleMasterTable();
        dt = DtVehicleMaster;
    }
    else if (reportName == "BusCosts.rdlc")
    {
        dataSource = "CgTempData_BusMaintenance";
        dt = rcg.BuildBusCostsTable(fromDate, toDate);
    }

    // Setup the DataSource
    this.reportViewer1.Visible = true;
    this.reportViewer1.LocalReport.ReportPath = "Reports\\" + reportName;
    this.reportViewer1.LocalReport.DataSources.Clear();
    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(dataSource, dt));
    this.reportViewer1.RefreshReport();
}

Any ideas how to remove all of the old remaining data? Do I dispose the object and recreate it?

© Stack Overflow or respective owner

Related posts about c#

Related posts about reportviewer