2

さて、私のシナリオは、フォーム上に単一のレポートビューアがあり、選択に基づいて複数のレポートを接続するというものです。すべてのレポートをビルドアクションの埋め込みリソースとして設定しています。

パラメータを設定する前に、このようなレポートを読み込んでいます。

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

ユーザー別の時間は、おかしくなりそうなセクションです。コードを見ると、そこには本当に役立つものは何もありません。私が最初に実行する限り、それは機能します。

4

2 に答える 2

8

あなたがする必要があるのはmyReportViewer.Reset()、新しいレポートをロードする前に呼び出すことです。これを行うと、ReportViewerコントロールがデフォルトの状態にリセットされ、LocalReportオブジェクトが新しいインスタンスに置き換えられます。これで問題が解決するはずです。

(実際、同じ解決策を持つ非常によく似た投稿に遭遇しました:: LocalReport.SetParameters例外このレポートで定義されていないレポートパラメーター「ParameterName」を設定しようとしました

于 2012-06-07T19:59:47.223 に答える
0

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();
于 2012-06-07T19:20:30.757 に答える