さて、私のシナリオは、フォーム上に単一のレポートビューアがあり、選択に基づいて複数のレポートを接続するというものです。すべてのレポートをビルドアクションの埋め込みリソースとして設定しています。
パラメータを設定する前に、このようなレポートを読み込んでいます。
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を最初に使用しなかったという理由だけで、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();
}
ユーザー別の時間は、おかしくなりそうなセクションです。コードを見ると、そこには本当に役立つものは何もありません。私が最初に実行する限り、それは機能します。