2

SharePoint 2010 と MS Reporting Server に基づくソリューションを実装しています。ReportViewerWepPart で問題が発生しています。レポートを印刷できないときにカスタム エラーを表示する必要があるシナリオがあります。残念ながら、ReportViewer ASP コントロールとは異なり、ReportViewerWepPart には、エラーが発生してレポートを印刷できないことを示すプロパティ/イベントがありません。問題にしばらく時間を費やした後、リフレクションを使用した解決策を見つけました。ReportViewerWepPart が ReportViewer を内部的に使用していることを発見し、このプライベート内部コンポーネントの ReportError イベントにアタッチしました。これが私のコードです:

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

残念ながら、この解決策は Web パーツのハックです。そのような方法でリフレクションを使用すると、問題が発生する可能性があると思いますか? レポートが印刷されているかどうかを確認する別の方法はありますか?

4

1 に答える 1

0

これは問題ありませんが、すべての例外を注意深くキャッチします。reportViewer を非表示にして、エラーに関係なく HandleError コードを呼び出しているようです。内部で問題なく処理される軽微な例外が発生する場合があり、reportViewer オブジェクトを非表示にすることは適切でない場合があります。あなたの HandleError コードが何をするのかはわかりませんが、処理しようとしている正確な印刷エラーを見つけるまでエラーをログ テーブルまたはファイルに静かに記録し、それを処理することだけを心配することをお勧めします。

于 2013-01-31T04:39:16.880 に答える