2012-05-22 122 views
2

好,所以我的情況是,我有一個窗體上的單個報表查看器,它基於選擇連接多個報表。我將所有報告設置爲構建操作的嵌入式資源。爲什麼我的報告在設置報告參數時拋出異常?

我在設置參數之前加載這樣的報告。

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

OR

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

用戶的時間,是嚇壞了的部分。通過查看代碼,這裏沒有什麼真正有用的。只要我先運行它,它就會工作。

回答

8

你需要做的是加載一個新的報告之前調用myReportViewer.Reset()。這樣做會將ReportViewer控件重置爲默認狀態,LocalReport對象將被替換爲新實例。這應該可以解決你的問題。

(其實,我只是偶然發現了一個非常類似的職位,有相同的解決方案:: LocalReport.SetParameters Exception An attempt was made to set a report parameter 'ParameterName' that is not defined in this report

+0

就是這樣!我不敢相信我沒有嘗試過......好好享受你的+50分:) – meanbunny

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(); 
+0

你不能將它的只讀,很遺憾。 – meanbunny

相關問題