为什么我的报表在设置报表参数时引发异常

本文关键字:报表 异常 设置 我的 为什么 参数 | 更新日期: 2023-09-27 18:35:10

好的,所以我的方案是,我在窗体上有一个报表查看器,它根据选择连接多个报表。我已将所有报表设置为生成操作的嵌入式资源。

在设置参数之前,我正在加载这样的报告。

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

用户的时间,是吓坏的部分。通过查看代码,那里没有什么真正有用的。只要我先运行它,它就可以工作。

为什么我的报表在设置报表参数时引发异常

您需要

做的是在加载新报告之前调用myReportViewer.Reset()。这样做会将 ReportViewer 控件重置为其默认状态,并且 LocalReport 对象将替换为新实例。这应该可以解决您的问题。

(实际上,我刚刚偶然发现了一个非常相似的帖子,它具有相同的解决方案:: LocalReport.SetParameters 异常 尝试设置此报告中未定义的报表参数"参数名称")

您是否尝试过将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();