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 部件中的一个 hack。你认为以这种方式使用反射会导致任何问题吗?我是否遗漏了什么,是否有另一种方法可以查看是否打印了报告?

4

1 回答 1

0

这很好,但我会小心捕捉所有异常。无论出现什么错误,您似乎都在隐藏 reportViewer 并调用 HandleError 代码。可能会发生轻微的异常,并且在内部处理时不会出现问题,并且隐藏 reportViewer 对象可能不合适。我不知道您的 HandleError 代码做了什么,但我建议您将错误悄悄地记录到日志表或文件中,直到您发现您要处理的确切打印错误,然后只担心处理它。

于 2013-01-31T04:39:16.880 回答