2012-10-31 54 views
2

我正在實施基於SharePoint 2010和MS Reporting Server的解決方案。我遇到了ReportViewerWepPart的問題。我有一個場景,當報告無法打印時,需要顯示自定義錯誤。不幸的是,與ReportViewer asp控件不同,ReportViewerWepPart沒有任何屬性/事件表明存在錯誤並且報告無法打印。花了一些時間解決了這個問題後,我使用反射來解決問題。我發現ReportViewerWepPart在內部使用了ReportViewer,並且我在此私有內部組件上附加了ReportError事件。這裏是我的代碼:如何處理ReportViewerWebPart報告打印錯誤?

… 
      try 
      { 
       ReportViewer rv = (reportViewer.GetType().GetField("m_reportViewer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(reportViewer) as ReportViewer); 
       rv.ReportError += new Microsoft.Reporting.WebForms.ReportErrorEventHandler(ReportWidgetControl_ReportError); 
      } 
      catch(Exception e) 
      { 
       LogHandler.LogError(e, "Unable to attach ReportViewerWebPart error hadler."); 
      } 
… 
     void ReportWidgetControl_ReportError(object sender, Microsoft.Reporting.WebForms.ReportErrorEventArgs e) 
     { 
      reportViewer.Visible = false; 
      HandleError(); 
     } 

不幸的是,這種解決方案是在網絡部分的黑客攻擊。你認爲以這種方式使用反射會導致任何問題嗎?我錯過了什麼,是否有另一種方式來查看是否打印報告?

回答

0

這很好,但我會小心捕捉所有異常。 看起來你隱藏了reportViewer並調用你的HandleError代碼,不管錯誤是什麼。可能會出現異常情況,屬於次要問題,內部處理沒有問題,隱藏reportViewer對象可能不合適。 我不知道你的HandleError代碼是幹什麼的,但是我建議你悄悄地把錯誤記錄到日誌表或文件中,直到你發現你正在處理的確切的打印錯誤,然後只處理它。