的ReportPath财产我也有类似的情况,你是我有一个可以创造服务然后,由于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);