Почему мои отчеты выдают исключение при настройке параметров отчета?
Итак, мой сценарий состоит в том, что у меня есть одна программа просмотра отчетов в форме, которая связывает несколько отчетов на основе выбора. Все мои отчеты установлены как встроенный ресурс для действия сборки.
Я загружаю отчеты, как это, прежде чем установить свои параметры.
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();