public void SubReport <TSubReport>(params Action <TSubReport>[] initializers) where TSubReport : Report, IEntityReport <TSubReportModel>, new() { Dictionary <string, Func <object, Report> > subReportDelegates; var report = _subReport.Report; if (!ReportDelegates.TryGetValue(report, out subReportDelegates)) { ReportDelegates.Add(report, subReportDelegates = new Dictionary <string, Func <object, Report> >()); } if (!subReportDelegates.ContainsKey(_subReport.Name)) { subReportDelegates.Add(_subReport.Name, o => { var subreport = new TSubReport { Name = string.Format(_subReport.Name), DataSource = o == null ? default(TSubReportModel) : _source((TReportModel)o) }; if (initializers != null) { initializers.ToList().ForEach(i => i(subreport)); } return(subreport); }); } _subReport.Bindings.Add(new Binding("ReportSource", "=EntityReportExtensions.GetSubReportSource(ReportItem.ItemDefinition, ReportItem.DataObject.RawData)")); }
public static ReportSource GetSubReportSource(SubReport subReport, object model) { InstanceReportSource reportSource = null; Dictionary <string, Func <object, Report> > subReportDelegates; var report = subReport.Report; if (ReportDelegates.TryGetValue(report, out subReportDelegates)) { Func <object, Report> subReportDelegate; if (subReportDelegates.TryGetValue(subReport.Name, out subReportDelegate)) { subReportDelegates.Remove(subReport.Name); if (!subReportDelegates.Any()) { ReportDelegates.Remove(report); } var reportDocument = subReportDelegate(model); reportSource = new InstanceReportSource { ReportDocument = reportDocument }; } } return(reportSource); }