2013-03-15 142 views
3

我一直在使用ReportViewer遇到一些問題。基本上,代碼如下:WinForms ReportViewer掛起應用程序WPF

public void Display(object dataSource, ReportViewer viewer) 
    { 
     currentDs = dataSource as MyTypes; 

     if (currentDs != null) 
     { 
      var param = new LinkedList<ReportParameter>(); 
      param.AddFirst(new ReportParameter("Title", "Title")); 
      viewer.ProcessingMode = ProcessingMode.Local; 
      viewer.LocalReport.ReportEmbeddedResource = ReportName; 
      viewer.LocalReport.EnableExternalImages = true; 
      viewer.LocalReport.DataSources.Add(new ReportDataSource(DataSourceName + "_Header", currentDs.Header)); 
      viewer.LocalReport.DataSources.Add(new ReportDataSource(DataSourceName + "_Footer", currentDs.Footer)); 
      viewer.LocalReport.DataSources.Add(new ReportDataSource(DataSourceName + "_Lines", currentDs.Lines)); 

      viewer.LocalReport.SetParameters(param); 
      viewer.RefreshReport(); 
     } 
    } 

的問題是,有時它生成的RDLC報告,但別人它只是掛起的應用程序。具體來說,它保持在viewer.RefreshReport();永遠。

在rdlc文件上正確設置了相應的參數和數據集。

有沒有人遇到類似的行爲?

在此先感謝。

+0

它使用相同的參數隨機發生嗎? – WiiMaxx 2013-03-22 14:25:01

+0

是的,它的確如此。有時懸掛和其他不與相同的數據集。 – 2013-03-22 14:55:46

+0

我的數據集是否包含相同的值? – WiiMaxx 2013-03-22 16:02:49

回答

1

我可能已經修復了它。這個頁面幫我弄明白了:http://ikriv.com/dev/dotnet/MysteriousHang.html

所以,看起來a)報表查看器需要在UI線程上創建,並且b)並不總是可靠地發生(詳見鏈接)。報告查看器是一個.NET 2分量,並在鏈接記錄的行爲適用於.NET 2

爲了解決這個問題,我採用了以下技巧:

  • 第一招:命名UI線程在啓動時
  • 第二招:強制一個句柄提前,然後得到同步上下文的引用
  • 第三招:使用線程名和同步上下文來影響調用required - > invoke idiom。

如果全部結合在一起,我會回來併發布w /更多的細節。

3

我想你的查看器configured正確。

第一次生成通常是否成功?您可以在每次生成報告後嘗試撥打viewer.Reset(),這可能會解決一些混合問題。

3

a post from 2006表面上似乎是相關的,可能會給你一個解決方法,雖然我不得不承認我自己沒有這樣做,因爲我幾乎不可能重新創建你看到的問題因此,如果有任何解決方法可以解決問題,也同樣不可能。這是不理想的,但我希望沒有這樣的事情作爲無用的信息:-)

相關信息是在鏈接的線程的底部,爲了清晰起見,我在下面引用它。

ReportViewer控件被分解爲兩個組件 - 報表對象(暴露爲.ServerReport和.LocalReport)和UI(實際的ReportViewer類)。報告對象存儲有關報告的所有狀態。 UI組件只需調用它們即可獲取顯示報告,參數提示,工具欄等所需的信息。

與大多數控件一樣,UI組件不是線程安全的。但報表對象是線程安全的。當您調用RefreshReport時,查看器使用後臺線程在報表對象上調用Render。但這不是控件調用報表對象的唯一時間。第一次需要編譯報告定義(本地報告)或創建會話(服務器報告)可能需要很長時間。如果這個「第一次」在RefreshReport期間,它會發生在後臺線程上。但正如你所看到的,它可能發生在其他時間。例如,填充參數UI需要調用GetParameters,這也需要啓動懲罰。

如果你想保證這個「第一次」懲罰是在後臺線程上,那麼在設置報告路徑和其他連接/數據源信息後,從後臺線程中調用GetParameters。

這似乎表明,你總是從後臺線程,而不是從UI線程使您ReportViewer一些呼叫,這樣,任何延遲都不會影響UI。這聽起來像是一個身體健康的設計!

這對你有幫助嗎?

0

我遇到的問題,Windows XP與.NET 4.0和報表查看器2010年是該操作系統是支持結束,但Windows嵌入式POSReady 2009年(的Windows XP SP3),它仍然在擴展支持,直到2019年四月

要解決的竅門,呼籲棄用的API呈現報表

rptviewer.LocalReport.ExecuteReportInSandboxAppDomain(); 

,當退出或重新運行報告如報告的參數發生了變化,報告需要正確清理

rptviewer.LocalReport.DataSources.Clear(); 
rptviewer.LocalReport.ReportEmbeddedResource = null; 
rptviewer.LocalReport.Dispose(); 
// release sandbox is required to prevent the lock up, see below note on display report 
rptviewer.LocalReport.ReleaseSandboxAppDomain(); 

// clean up report viewer 
rptviewer.Clear(); 
rptviewer.Reset(); 

Windows 7,8,8.1和10的注意事項掛起問題未出現。