⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderdatareport.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
字号:

//
// SharpDevelop ReportEditor
//
// Copyright (C) 2005 Peter Forstmeier
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// Peter Forstmeier (Peter.Forstmeier@t-online.de)

using System;

using System.Data;
using System.Drawing;
using System.ComponentModel;
using System.Globalization;
using System.Drawing.Printing;
	
using SharpReportCore;

	/// <summary>
	/// Renderer for DataReports
	/// </summary>
	/// <remarks>
	/// 	created by - Forstmeier Peter
	/// 	created on - 13.12.2004 11:07:59
	/// </remarks>
	/// 

namespace SharpReportCore {
	public class RenderDataReport : AbstractDataRenderer {

		private PointF currentPoint;
		private DataNavigator dataNavigator;

		
		public RenderDataReport(ReportModel model,DataManager dataManager):base (model,dataManager){
//			base.DataManager.GroupChanged += new EventHandler<GroupChangedEventArgs>(OnGroupChanged);
//			base.DataManager.GroupChanging += new EventHandler <EventArgs> (OnGroupChanging);
		}
		

		void OnGroupChanged (object sender,GroupChangedEventArgs e) {
			
			System.Console.WriteLine("OnGroupChanged");	
		}
		
		void OnGroupChanging (object sender, EventArgs e) {
			
			System.Console.WriteLine("OnGroupChanging");	
		}
		
		private void OnListChanged (object sender,System.ComponentModel.ListChangedEventArgs e) {
//			System.Console.WriteLine("List Changed sender <{0}> reason <{1}>",
//			                         sender.ToString(),
//			                         e.ListChangedType);
		}
		
		
		private void OnSectionPrinting (object sender,SectionPrintingEventArgs e) {
//			System.Console.WriteLine("");
//			System.Console.WriteLine("Begin Print <{0}> with  <{1}> Items ",e.Section.Name,
//			                         e.Section.Items.Count);
		}
		
		private void OnSectionPrinted (object sender,SectionPrintingEventArgs e) {
//			System.Console.WriteLine("Section Printed <{0}> ",e.Section.Name);
			
		}
		
		private void AddSectionEvents () {
			base.CurrentSection.SectionPrinting += new EventHandler<SectionPrintingEventArgs>(OnSectionPrinting);
			base.CurrentSection.SectionPrinted += new EventHandler<SectionPrintingEventArgs>(OnSectionPrinted);
		}
		
		private void RemoveSectionEvents () {
			base.CurrentSection.SectionPrinting -= new EventHandler<SectionPrintingEventArgs>(OnSectionPrinting);
			base.CurrentSection.SectionPrinted -= new EventHandler<SectionPrintingEventArgs>(OnSectionPrinted);
		}
		
		#region overrides
		
		#region Draw the different report Sections
		private PointF DoReportHeader (ReportPageEventArgs rpea){
			PointF endAt = base.MeasureReportHeader (rpea);

			this.AddSectionEvents();
			base.RenderSection (base.CurrentSection,rpea);
			this.RemoveSectionEvents();
			
			if (base.CurrentSection.PageBreakAfter) {
				base.PageBreak(rpea,base.CurrentSection);
				base.CurrentSection.PageBreakAfter = false;
				return new PointF();
			}
			return endAt;
		}
		
		
		private PointF DoPageHeader (PointF startAt,ReportPageEventArgs rpea){
			
			PointF endAt = base.MeasurePageHeader (startAt,rpea);

			this.AddSectionEvents();
			base.RenderSection (base.CurrentSection,rpea);
			this.RemoveSectionEvents();
			return endAt;
		}
		
		
		private void DoPageEnd (ReportPageEventArgs rpea){
//			System.Console.WriteLine("\tDoPageEnd");
			base.PrintPageEnd(this,rpea);
			base.MeasurePageEnd (rpea);
			
			this.AddSectionEvents();
			base.RenderSection (base.CurrentSection,rpea);
			this.RemoveSectionEvents();
			
		}
		
		//TODO how should we handle ReportFooter, print it on an seperate page ????
		private void  DoReportFooter (PointF startAt,ReportPageEventArgs rpea){
			base.MeasureReportFooter(rpea);

			this.AddSectionEvents();
			base.RenderSection (base.CurrentSection,rpea);
			this.RemoveSectionEvents();
		}
		#endregion

		protected override void ReportQueryPage(object sender, QueryPageSettingsEventArgs qpea) {
			base.ReportQueryPage (sender,qpea);
		}
			
		protected override void ReportBegin(object sender, ReportPageEventArgs rpea) {
			base.ReportBegin (sender,rpea);
		
			base.DataManager.ListChanged += new EventHandler<ListChangedEventArgs> (OnListChanged);
			dataNavigator = base.DataManager.GetNavigator;
			dataNavigator.ListChanged += new EventHandler<ListChangedEventArgs> (OnListChanged);
			dataNavigator.Reset();
			base.DataNavigator = dataNavigator;
		}
		
		protected override void BeginPrintPage(object sender, ReportPageEventArgs rpea) {
//			System.Console.WriteLine("!!! BeginPrintpage");
			if (rpea == null) {
				throw new ArgumentNullException("rpea");
			}
			
			base.BeginPrintPage (sender,rpea);
			
			if (rpea.PageNumber == 1) {
				//Draw ReportHeader
				this.currentPoint = DoReportHeader (rpea);
			}
			
			//Draw Pageheader
			this.currentPoint = DoPageHeader (this.currentPoint,rpea);
			
			base.DetailStart = new Point ((int)currentPoint.X,(int)currentPoint.Y);
		
		}
		
	
			
		protected override void PrintBodyStart(object sender, ReportPageEventArgs rpea) {
			Rectangle sectionRect;
			Rectangle detailRect;

			base.PrintBodyStart (sender,rpea);

			BaseSection section = base.CurrentSection;
			
			section.SectionOffset = (int)this.currentPoint.Y + base.Gap;
			
			detailRect = base.DetailRectangle (rpea);
			
			//this is only for the first record, zhe other details will be calculated
			sectionRect = new Rectangle (rpea.PrintPageEventArgs.MarginBounds.Left,
			                             section.SectionOffset,
			                             rpea.PrintPageEventArgs.MarginBounds.Width,
			                             section.Size.Height);
//			DebugRectangle (e,detailRect);
			
			// no loop if there is no data

			if (! this.dataNavigator.HasMoreData ) {
				rpea.PrintPageEventArgs.HasMorePages = false;
				return;
			}

			while (this.dataNavigator.MoveNext()) {
				this.dataNavigator.Fill (base.CurrentSection.Items);	
				base.RenderSection (section,rpea);
				section.SectionOffset = section.SectionOffset + section.Size.Height  + 2 * base.Gap;
				
				base.FitSectionToItems (base.CurrentSection,rpea);
				
				sectionRect = new Rectangle (rpea.PrintPageEventArgs.MarginBounds.Left,
				                             section.SectionOffset,
				                             rpea.PrintPageEventArgs.MarginBounds.Width,
				                             section.Size.Height);
				
				if (!detailRect.Contains(sectionRect)) {
					base.PageBreak(rpea,section);
					return;
				}	
				
			}
			
			DoReportFooter (new PointF(0,section.SectionOffset + section.Size.Height),
			                rpea);
				
			rpea.PrintPageEventArgs.HasMorePages = false;

			//Did we have a pagebreak 
			if (base.CurrentSection.PageBreakAfter) {
				base.PageBreak(rpea,section);
				base.CurrentSection.PageBreakAfter = false;
				return;
			}
		}
		
		
		protected override void PrintBodyEnd(object sender, ReportPageEventArgs rpea) {
//			System.Console.WriteLine("PrintBodyEnd");
			base.PrintBodyEnd (sender,rpea);
		}
		
		
		protected override void PrintPageEnd(object sender, ReportPageEventArgs rpea) {
			System.Console.WriteLine("!! Page End");
			this.DoPageEnd (rpea);
		}
	
		public override string ToString() {
			base.ToString();
			return "RenderDataReport";
		}
		#endregion

		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -