Пример #1
0
        // OnPrintPage event, triggered on each new page
        protected override void OnPrintPage(PrintPageEventArgs e)
        {
            EspackPrintingArea _previousArea = null;

            var _g = e.Graphics;

            _g.PageUnit = GraphicsUnit.Millimeter;


            if (Pager.Counter == 0)
            {
                float _minBodyY = 0;
                float _maxBodyY = 0;

                //VisibleArea=new RectangleF(HardMargins.X,HardMargins.Y,_g.VisibleClipBounds.)
                VisibleArea = new RectangleF(_g.VisibleClipBounds.X, _g.VisibleClipBounds.Y, _g.VisibleClipBounds.Width, _g.VisibleClipBounds.Height);

                PointF _pagerSize;

                // Header areas
                Areas.Where(_item => (_item.Zone == EnumDocumentZones.HEADER)).ToList().ForEach(_item =>
                {
                    _item.ArrangeItems(_g, HardMargins, _previousArea);
                    _minBodyY     = (_minBodyY < _item.Y + _item.Height) ? _item.Y + _item.Height : _minBodyY;
                    _previousArea = _item;
                });

                // Footer areas
                _previousArea = null;
                Areas.Where(_item => (_item.Zone == EnumDocumentZones.FOOTER)).ToList().ForEach(_item =>
                {
                    _item.ArrangeItems(_g, HardMargins, _previousArea);
                    _maxBodyY     = (_maxBodyY < _item.Y + _item.Height) ? _item.Y + _item.Height : _maxBodyY;
                    _previousArea = _item;
                });

                _maxBodyY = _g.VisibleClipBounds.Bottom - HardMargins.Y - _maxBodyY;

                // If pager is active, we must take it into account
                if (Pager.Active)
                {
                    _pagerSize = Pager.Size(_g);
                    _maxBodyY -= _pagerSize.Y;
                    Pager.Y    = _g.VisibleClipBounds.Bottom - HardMargins.Y - _pagerSize.Y;
                    Pager.X    = _g.VisibleClipBounds.Right - HardMargins.X - _pagerSize.X;
                }

                // Move the footer relative positions to its absolute place
                Areas.Where(_item => (_item.Zone == EnumDocumentZones.FOOTER)).ToList().ForEach(_item =>
                {
                    _item.Move(0, _maxBodyY);
                });

                // Set the Y limits for body areas
                Areas.Where(_item => (_item.Zone == EnumDocumentZones.BODY)).ToList().ForEach(_item =>
                {
                    _item.Y         = _minBodyY;
                    _item.MaxHeight = _maxBodyY;
                    Pager.Rows      = Pager.Rows < _item.Items.Count ? _item.Items.Count : Pager.Rows;
                });
                Pager.Counter = 1;
                Pager.Total   = 1;
            }

            _previousArea = null;

            // body areas stuff
            Areas.Where(_item => (_item.Zone == EnumDocumentZones.BODY)).ToList().ForEach(_item =>
            {
                _item.ArrangeItems(_g, HardMargins, _previousArea);
                _previousArea = _item;
            });


            // printing
            Areas.ForEach(_item =>
            {
                _item.Draw(_g);
                if (_item.Zone == EnumDocumentZones.BODY && Pager.Counter == 1 && Pager.Total == 1)
                {
                    Pager.Total = (int)Math.Ceiling((_item.DataRows + 0.0) / (_item.DataRows - (_item.Items.Count - _item.PermanentRows)));
                }
            });

            // paging
            if (Pager.Active)
            {
                _g.DrawString(Pager.Text, Pager.Font.Font, Pager.Font.Brush, Pager.X, Pager.Y);
            }
            e.HasMorePages = Pager.Counter < Pager.Total;
            Pager.Counter++;

            base.OnPrintPage(e);
        }