Почему мои отчеты выдают исключение при настройке параметров отчета?

Итак, мой сценарий состоит в том, что у меня есть одна программа просмотра отчетов в форме, которая связывает несколько отчетов на основе выбора. Все мои отчеты установлены как встроенный ресурс для действия сборки.

Я загружаю отчеты, как это, прежде чем установить свои параметры.

myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport1.rdlc";

ИЛИ ЖЕ

myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport2.rdlc";

Эта ситуация очень странная. Допустим, я запускаю приложение и сначала выбираю MyReport1 и запускаю его. Этот отчет содержит параметры. MyReport2 не имеет никаких параметров, только источники данных. MyReport1 загрузится правильно и все работает отлично. Затем я могу переключиться на MyReport2 и переходить от одного отчета к другому и обратно столько раз, сколько захочу.

Допустим, я запускаю MyReport2 первым. Он загружается правильно, и я могу запустить его несколько раз. Однако, если я переключаюсь обратно на MyReport1, он выдает следующее исключение, когда я пытаюсь установить параметры.

An attempt was made to set a report parameter 'TotalTime' that is not defined in this report.

Глядя на это исключение, я бы предположил, что MyReport1 по какой-то причине не загружался. Когда я устанавливаю LocalReport.ReportEmbeddedResource. Что может привести к неправильной загрузке MyReport1 только потому, что я не использовал его первым?

Вот код, я, конечно, обрезал фрагменты, которые не могу показать.

if (ReportComboBox.SelectedItem.ToString() == "Time by user") {
     myReportViewer.LocalReport.DataSources.Clear();
     ReportDataSource datasource = new ReportDataSource();
     datasource.Name = "DataSet1";
     datasource.Value = DataSet1BindingSource;
     myReportViewer.LocalReport.DataSources.Add(datasource);
     try {
          myReportViewer.LocalReport.ReportEmbeddedResource = "";
          myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport1.rdlc";
          ReportParameter test = new ReportParameter("TotalTime", total.ToString("c"));
          myReportViewer.LocalReport.SetParameters(test);
          myReportViewer.RefreshReport();
     } catch (Exception ex) { 

     }
} else if (ReportComboBox.SelectedItem.ToString() == "Time - Everyone") {
     myReportViewer.LocalReport.DataSources.Clear();
     ReportDataSource datasource = new ReportDataSource();
     datasource.Name = "CompetitionUsers";
     datasource.Value = MyData;
     myReportViewer.LocalReport.DataSources.Add(datasource);
     myReportViewer.LocalReport.ReportEmbeddedResource = "";
     myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport2.rdlc";
     myReportViewer.RefreshReport();
}

Время по пользователю, это раздел, который волнуется. Глядя на код, там нет ничего действительно полезного. Он работает до тех пор, пока я запускаю его первым.

2 ответа

Решение

Что вам нужно сделать, это позвонить myReportViewer.Reset() перед загрузкой нового отчета. Это вернет элемент управления ReportViewer в его состояние по умолчанию, и объект LocalReport будет заменен новым экземпляром. Это должно решить вашу проблему.

(На самом деле, я только что наткнулся на очень похожий пост с тем же решением: Исключение LocalReport.SetParameters. Была предпринята попытка установить параметр отчета "ParameterName", который не определен в этом отчете)

Вы пытались установить для ReportViewer.LocalReport значение NULL и восстанавливать его каждый раз, когда пользователь обнаруживает изменение?

Редактировать:

Попробуйте установить параметры отчета в следующем порядке, если пользователь выбирает первый вариант отчета:

 ReportParameter[] param = new ReportParameter[1];
 param[0] = new ReportParameter("Report_Parameter_0",txtParameter.Text);
        ReportViewer1.LocalReport.SetParameters(param);

        ReportDataSource rds = new ReportDataSource
            ("DataSet1_Customers_DataTable1", customerList);
        ReportViewer1.LocalReport.DataSources.Clear();
        ReportViewer1.LocalReport.DataSources.Add(rds);
        ReportViewer1.LocalReport.Refresh();
Другие вопросы по тегам