我的情况与您类似,我有可以创建本地报告的服务,然后可以将其生成为 PDF、通过电子邮件发送等。但是,因为 ReportViewer.LocalReport 是只读属性,我不得不复制使用的代码构建报告或将值从我的 LocalReport 复制到 ReportViewer.LocalReport。我不喜欢这两种选择,因为要么某些东西可能不会被复制(即子报告事件),要么存在代码重复。
我想出了以下扩展,它通过反射在 ReportViewer 上设置 LocalReport。我还没有完全测试过,这可能是个坏主意!但是,它似乎适用于我目前正在从事的项目。我不知道 ReportViewer 是否对其本地报告进行了一些额外的初始化,所以可能会发生一些事情......
我不能强调这一点 - 使用风险自负 - 这样做可能不是一个好主意
public static class ReportViewerExtensions
{
public static void SetLocalReport(this ReportViewer reportViewer, LocalReport report)
{
var currentReportProperty = reportViewer.GetType().GetProperty("CurrentReport", BindingFlags.NonPublic | BindingFlags.Instance);
if (currentReportProperty != null)
{
var currentReport = currentReportProperty.GetValue(reportViewer, null);
var localReportField = currentReport.GetType().GetField("m_localReport", BindingFlags.NonPublic | BindingFlags.Instance);
if (localReportField != null)
{
localReportField.SetValue(currentReport, report);
}
}
reportViewer.RefreshReport();
}
}
用法:
LocalReport localReport = reportService.GenerateCurrentOrdersReport(....);
reportViewer.SetLocalReport(localReport);