我正在基于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部分中的一个黑客攻击。您是否认为以这种方式进行反射会导致任何问题?我是否缺少某些东西,还有另一种方法可以查看报告是否打印了吗?
这很好,但是我会谨慎地捕获所有例外。看起来您正在隐藏报告视图并调用您的handleror代码,无论其错误是什么。可能发生的例外是次要的,并且在内部没有问题的情况下进行处理,并且隐藏报告视图对象可能不合适。我不知道您的句柄代码做了什么,但我建议将错误记录到日志表或文件,直到您发现要处理的确切打印错误,然后只担心处理该错误。
<</p>