using System.ComponentModel; using System.Drawing; using System.Drawing.Design; using FastReport.Utils; namespace FastReport { /// /// Represents a subreport object. /// /// /// To create a subreport in code, you should create the report page first and /// connect it to the subreport using the property. /// /// The following example shows how to create a subreport object in code. /// /// // create the main report page /// ReportPage reportPage = new ReportPage(); /// reportPage.Name = "Page1"; /// report.Pages.Add(reportPage); /// // create report title band /// reportPage.ReportTitle = new ReportTitleBand(); /// reportPage.ReportTitle.Name = "ReportTitle1"; /// reportPage.ReportTitle.Height = Units.Millimeters * 10; /// // add subreport on it /// SubreportObject subreport = new SubreportObject(); /// subreport.Name = "Subreport1"; /// subreport.Bounds = new RectangleF(0, 0, Units.Millimeters * 25, Units.Millimeters * 5); /// reportPage.ReportTitle.Objects.Add(subreport); /// // create subreport page /// ReportPage subreportPage = new ReportPage(); /// subreportPage.Name = "SubreportPage1"; /// report.Pages.Add(subreportPage); /// // connect the subreport to the subreport page /// subreport.ReportPage = subreportPage; /// /// public partial class SubreportObject : ReportComponentBase { private ReportPage reportPage; private bool printOnParent; #region Properties /// /// Gets or sets a report page that contains the subreport bands and objects. /// //[Browsable(false)] [Editor("FastReport.TypeEditors.SubreportPageEditor, FastReport", typeof(UITypeEditor))] [TypeConverter(typeof(FastReport.TypeConverters.ComponentRefConverter))] public ReportPage ReportPage { get { return reportPage; } set { if (value == Page) return; if (reportPage != null && value != reportPage) { RemoveSubReport(false); } if (value != null) { value.Subreport = this; value.PageName = Name; } reportPage = value; } } /// /// Gets or sets a value indicating that subreport must print its objects on a parent band to which it belongs. /// /// /// Default behavior of the subreport is to print subreport objects they own separate bands. /// [DefaultValue(false)] [Category("Behavior")] public bool PrintOnParent { get { return printOnParent; } set { printOnParent = value; } } #endregion private void RemoveSubReport(bool delete) { if (reportPage != null) { if (Report != null) { foreach (Base obj in Report.AllObjects) { if (obj is SubreportObject && obj != this) { SubreportObject subReport = obj as SubreportObject; if (subReport.ReportPage == reportPage) { reportPage.Subreport = subReport; reportPage.PageName = subReport.Name; reportPage = null; break; } } } } if (reportPage != null) { if (delete && Report != null) { reportPage.Dispose(); } else { reportPage.Subreport = null; reportPage.PageName = reportPage.Name; } reportPage = null; } } } #region Public Methods /// public override void Assign(Base source) { base.Assign(source); SubreportObject src = source as SubreportObject; PrintOnParent = src.PrintOnParent; } /// public override void Serialize(FRWriter writer) { SubreportObject c = writer.DiffObject as SubreportObject; base.Serialize(writer); writer.WriteRef("ReportPage", ReportPage); if (PrintOnParent != c.PrintOnParent) writer.WriteBool("PrintOnParent", PrintOnParent); } #endregion /// /// Initializes a new instance of the class with default settings. /// public SubreportObject() { Fill = new SolidFill(SystemColors.Control); FlagUseBorder = false; FlagUseFill = false; FlagPreviewVisible = false; SetFlags(Flags.CanCopy, false); } } }