Переключение источников данных в ReportViewer в WinForms - PullRequest
3 голосов
/ 18 мая 2010

Я создал winform для пользователей, чтобы просматривать многие отчеты, которые я создаю для них. У меня есть выпадающий список с именем отчета, который вызывает соответствующие поля для отображения параметров. Как только они заполнены, они нажимают Отправить, и появляется отчет. Это работает в первый раз, когда они попадают на экран. Они могут изменить параметры и ReportViewer работает нормально. Измените на другой отчет, и я получаю следующую ошибку ReportViewer:

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".

Насколько я использую процесс:

  1. Я установил reportName (строка) физическое имя RDLC.
  2. Я установил dataSource (строку) в качестве имени источника данных
  3. Я заполняю универсальную таблицу данных данными для запуска отчета.
  4. Сделать ReportViewer видимым
  5. Установить LocalReport.ReportPath = "Reports\\" = reportName;
  6. Очистить LocalReport.DataSources.Clear()
  7. Добавить новый LocalReport.DataSources.Add(new ReportDataSource(dataSource, dt));
  8. RefreshReport() в ReportViewer.

Вот часть кода, которая настраивается и отображает 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();
}

Есть идеи, как удалить все старые оставшиеся данные? Нужно ли утилизировать объект и воссоздать его?

1 Ответ

2 голосов
/ 18 мая 2010

Я понял это. Мне нужно было добавить: reportViewer1.Reset(); в начало метода.

...