У меня была похожая ситуация с вами, когда у меня были службы, которые могут создавать локальный отчет, который затем можно было бы создать в PDF, отправить по электронной почте и т. Д. Однако, поскольку ReportViewer.LocalReport - свойство только для чтения, мне пришлось либо дублироватькод, используемый для построения отчета или копирования значений из моего LocalReport в ReportViewer.LocalReport.Я не являюсь поклонником любого варианта, потому что либо что-то может не копироваться (то есть событие подотчетности), либо есть дублирование кода.
Я придумал следующее расширение, которое устанавливает LocalReport для ReportViewer с отражением,Я не полностью проверил это, и это может быть плохой идеей!Тем не менее, похоже, что это работает для проекта, над которым я сейчас работаю.Я понятия не имею, выполняет ли 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);