打印控件

 public class UPrintFome : PrintDocument
    {
        #region 自定义函数变量

        #region 自定义变量
        private bool _IsSaved = false;
        private bool _SpecialFxt = false;
        public bool IsDisplayPrintDialog = false;
        public int _PageNumber;     //打印控制变量
        private int _PageNum = 0;     //打印总页数
        private int _PageN = 0;         //打印第几页
        private string _PrintDocumentName;    //打印的文档名
        private Font sysFont;       //字体格式
        private PageSettings _pageSize = new PageSettings(); //纸张大小
        private PageDistance _pageDistance = new PageDistance(); //页边距
        private Graphics myGr;      //绘制区域
        //private int iLineNumber;            //绘制的行数
        private float _fYPosition;           //绘制位置Y
        private float _fXPosition;           //绘制位置X
        private int X;                      //绘制区起始位置X坐标
        private int Y;                      //绘制区起始位置Y坐标
        private int _Width;                 //绘制区宽度
        private int _Height;                //绘制区高度
        private bool pageFace = false;      //打印方向

        private int irow = 0;     //表格每页的开始行数
        private int beginrow = 0;     //表格每页的开始行数
        private int endrow = 0;       //表格每页的结束行数
        private int krow = 0;       //表格空白行数

        private PrintDocument print;
        private int _PageStarNum = 0;   //打印起始页
        private int _pageEndNum = 0;    //打印末尾页
        private bool _bPages = false;
        private PrintPreviewDialog dlg;
        #endregion

        #region 自定义结构

        #region 页边距
        public struct PageDistance
        {
            public int left;
            public int right;
            public int top;
            public int foot;
        }
        #endregion

        #region 居左,居中,居右
        public enum FontType
        {
            left,
            middle,
            right
        }
        #endregion

        #endregion

        #region 自定义属性

        public int Width
        {
            get
            {
                if (!pageFace)
                    return _Width;
                else
                    return _Height;
            }
        }

        public int Height
        {
            get
            {
                if (!pageFace)
                    return _Height;
                else
                    return _Width;
            }
        }

        public float FontHeight
        {
            get
            {
                return sysFont.GetHeight(myGr);
            }
        }

        public int PageBeginRow
        {
            get
            {
                return beginrow;
            }
            set
            {
                beginrow = value;
            }
        }

        public bool SpecialFxt
        {
            get
            {
                return _SpecialFxt;
            }
            set
            {
                _SpecialFxt = value;
            }
        }

        public bool IsSaved
        {
            get
            {
                return _IsSaved;
            }
            set
            {
                _IsSaved = value;
            }
        }

        public bool bPages
        {
            get
            {
                return _bPages;
            }
            set
            {
                _bPages = value;
            }
        }

        #region 正在打印的页数
        public int PageNum
        {
            get
            {
                return _PageN;
            }
        }
        #endregion

        #endregion

        #region 委托事件

        #region 绘制打印区
        public delegate void UserHandler();
        public delegate void UserEventHandler(object sender, FormClosingEventArgs e);
        public event UserHandler sPrint;
        public event UserHandler SetFxtFlowNo;
       // public event UserEventHandler FormClosing;

        private void onPrint(object sender, PrintPageEventArgs e)
        {
            _PageN++;

            if (_PageStarNum > 0)
            {
                while (_PageN < _PageStarNum)
                {
                    myGr = e.Graphics;

                    //iLineNumber = 0;
                    X = _pageDistance.left;
                    Y = _pageDistance.top;
                    _Width = (int)print.DefaultPageSettings.PrintableArea.Width - _pageDistance.left - _pageDistance.right;
                    _Height = (int)print.DefaultPageSettings.PrintableArea.Height - _pageDistance.top - _pageDistance.foot;
                    //_Width = _pageSize.PaperSize.Width - _pageDistance.left - _pageDistance.right - (int)print.DefaultPageSettings.PrintableArea.X;
                    //_Height = _pageSize.PaperSize.Height - _pageDistance.top - _pageDistance.foot - (int)print.DefaultPageSettings.PrintableArea.Y;
                    _fYPosition = Y;
                    _fXPosition = X;
                    sysFont = new Font("宋体", 10, FontStyle.Regular);

                    sPrint();

                    myGr.Clear(Color.White);

                    _PageN++;
                }
            }

            myGr = e.Graphics;

            //iLineNumber = 0;
            X = _pageDistance.left;
            Y = _pageDistance.top;
            _Width = (int)print.DefaultPageSettings.PrintableArea.Width - _pageDistance.left - _pageDistance.right;
            _Height = (int)print.DefaultPageSettings.PrintableArea.Height - _pageDistance.top - _pageDistance.foot;
            //_Width = _pageSize.PaperSize.Width - _pageDistance.left - _pageDistance.right - (int)print.DefaultPageSettings.PrintableArea.X;
            //_Height = _pageSize.PaperSize.Height - _pageDistance.top - _pageDistance.foot - (int)print.DefaultPageSettings.PrintableArea.Y;
            _fYPosition = Y;
            _fXPosition = X;
            sysFont = new Font("宋体", 10, FontStyle.Regular);

            sPrint();


            if (_pageEndNum != 0 && _PageN == _pageEndNum)
                _PageNumber = 0;

            _PageNumber--;
            if (_PageNumber >= 0)
            {
                if (_PageNum != 0)
                {
                    if (_PageN <= _PageNum)
                    {
                        e.HasMorePages = true;
                    }
                    else
                        e.HasMorePages = false;
                }
                else
                    e.HasMorePages = true;
            }
            else
                e.HasMorePages = false;
        }
        public event UserHandler btnPrint_Click;
        #endregion

        #region 准备打印
        private void beginPrint(object sender, PrintEventArgs e)
        {
            _PageStarNum = 0;
            _pageEndNum = 0;
            if (_PageNumber < 0)
            {
                PrintDialog dlg = new PrintDialog();
                dlg.Document = print;
                //dlg.AllowCurrentPage = true;
                //dlg.AllowSelection = true;
                dlg.AllowSomePages = true;
                dlg.PrinterSettings.FromPage = 0;
                dlg.PrinterSettings.ToPage = 0;
                try
                {
                        btnPrint_Click();
                }
                catch { }
                if (dlg.ShowDialog() != DialogResult.OK)
                {
                    e.Cancel = true;
                    return;
                }
                else
                {
                    _PageStarNum = dlg.PrinterSettings.FromPage;
                    _pageEndNum = dlg.PrinterSettings.ToPage;
                    if (SpecialFxt)
                    {
                        SetFxtFlowNo();
                    }
                }
            }

            irow = 0;     //表格每页的开始行数
            beginrow = 0;     //表格每页的开始行数
            endrow = 0;       //表格每页的结束行数
            krow = 0;
            _PageN = 0;
            _PageNumber = _PageNum - 1;
            if (_PageNumber < 0)
            {
                _PageNumber = 0;
            }
        }
        #endregion

        #endregion

        #region 自定义函数

        public void SetSystemFont(Font font)
        {
            sysFont = font;
        }

        public Font GetFont(string strFontName, int FontSize, FontStyle fsStyle)
        {
            Font f = new Font(strFontName, FontSize, fsStyle);
            return f;
        }

        #region 打印预设置

        #region 设置打印的页数
        public int PageNumber
        {
            get
            {
                return _PageNum;
            }
            set
            {
                int i = value;
                if (i < 0)
                {
                    i = 0;
                }
                _PageNum = i;
            }
        }
        #endregion

        #region 设置打印的名称
        public string PrintDocumentName
        {
            get
            {
                return _PrintDocumentName;
            }
            set
            {
                _PrintDocumentName = value;
            }
        }
        #endregion

        #region 设置默认纸张大小
        public void SetPaperSize(string strName, int weigh, int height)
        {
            _pageSize.PaperSize = new PaperSize(strName, weigh, height);
            return;
        }
        #endregion

        #region 设置打印方向
        public bool PageFace
        {
            get
            {
                return pageFace;
            }
            set
            {
                pageFace = value;
            }
        }
        #endregion

        #region 设置页边距,单位为英制
        public PageDistance pageDistance
        {
            get
            {
                return _pageDistance;
            }
            set
            {
                _pageDistance = value;
            }
        }
        #endregion

        #region 绘制点的位置
        public float fXPosition
        {
            get
            {
                return _fXPosition;
            }
            set
            {
                _fXPosition = value;
            }
        }
        public float fYPosition
        {
            get
            {
                return _fYPosition;
            }
            set
            {
                _fYPosition = value;
            }
        }
        #endregion

        #endregion

        #region 绘制打印

        #region 基本绘制

        #region 绘制图像
        public void DrawImage(Image img, int x, int y, int w, int h)
        {
            
            myGr.DrawImage (img ,x,y ,w ,h  );
            return;
        }
        #endregion

        #region 绘制一条直线
        public void DrawLine(Point p1, Point p2)
        {
            Pen p = new Pen(Color.Black, 1);
            myGr.DrawLine(p, p1, p2);
            return;
        }
        #endregion

        #region 绘制一个矩形框
        public void DrawRect(Point point, int w, int h)
        {
            Pen p = new Pen(Color.Black, 1);
            myGr.DrawRectangle(p, point.X, point.Y, w, h);
            return;
        }
        #endregion

        #region 绘制文字
        public void DrawString(string strText, Color color, float X, float Y, float w, FontType fonttype, bool b)
        {
            int iFont = 0;
            DrawString(strText, color, X, Y, w, fonttype, b, iFont);
        }

        public void DrawString(string strText, Color color, float X, float Y, float w, FontType fonttype, bool b, int iFont)
        {
            StringFormat format = new StringFormat();
            RectangleF rc = new RectangleF();
            Font f = new Font(sysFont.Name, sysFont.Size - iFont, sysFont.Style);
            //myGr.PageUnit = GraphicsUnit.Pixel;
            if (b)
            {
                #region 分左、中、右三种情况
                RectangleF r = new RectangleF();
                switch (fonttype)
                {
                    case FontType.left:
                        format.Alignment = StringAlignment.Near;
                        rc.X = X;
                        rc.Y = Y;
                        rc.Width = w;

                        r.X = X + iFont;
                        r.Y = Y + iFont;
                        r.Width = w;
                        myGr.DrawString(strText, f, new SolidBrush(color), r, format);
                        break;
                    case FontType.middle:
                        format.Alignment = StringAlignment.Center;
                        rc.X = X;
                        rc.Y = Y;
                        rc.Width = w;

                        r.X = X + iFont;
                        r.Y = Y + iFont;
                        r.Width = w;
                        myGr.DrawString(strText, f, new SolidBrush(color), r, format);
                        break;
                    case FontType.right:
                        format.Alignment = StringAlignment.Far;
                        rc.X = X;
                        rc.Y = Y;
                        rc.Width = w;

                        r.X = X + iFont;
                        r.Y = Y + iFont;
                        r.Width = w;
                        myGr.DrawString(strText, f, new SolidBrush(color), r, format);
                        break;
                }
                #endregion
                int iLine = 0;
                float W = (float)((myGr.MeasureString(strText, sysFont).Width) * 1.1);
                while (W > 0)
                {
                    iLine++;
                    W -= w;
                }
                _fYPosition += iLine * sysFont.GetHeight(myGr);
            }
            else
            {
                #region 分左、中、右三种情况
                RectangleF r = new RectangleF();
                switch (fonttype)
                {
                    case FontType.left:
                        format.Alignment = StringAlignment.Near;
                        rc.X = X;
                        rc.Y = Y;
                        rc.Width = w;
                        rc.Height = sysFont.GetHeight(myGr);

                        r.X = X + iFont;
                        r.Y = Y + iFont;
                        r.Width = w;
                        r.Height = f.GetHeight(myGr);
                        myGr.DrawString(strText, f, new SolidBrush(color), r, format);
                        break;
                    case FontType.middle:
                        format.Alignment = StringAlignment.Center;
                        rc.X = X;
                        rc.Y = Y;
                        rc.Width = w;
                        rc.Height = sysFont.GetHeight(myGr);

                        r.X = X + iFont;
                        r.Y = Y + iFont;
                        r.Width = w;
                        r.Height = f.GetHeight(myGr);
                        myGr.DrawString(strText, f, new SolidBrush(color), r, format);
                        break;
                    case FontType.right:
                        format.Alignment = StringAlignment.Far;
                        rc.X = X;
                        rc.Y = Y;
                        rc.Width = w;
                        rc.Height = sysFont.GetHeight(myGr);

                        r.X = X + iFont;
                        r.Y = Y + iFont;
                        r.Width = w;
                        r.Height = f.GetHeight(myGr);
                        myGr.DrawString(strText, f, new SolidBrush(color), r, format);
                        break;
                }
                #endregion

                _fYPosition += rc.Height;
            }
        }
        #endregion

        #region 换行
        public void DrawNewLine()
        {
            _fXPosition = pageDistance.left;
            _fYPosition += sysFont.GetHeight(myGr);
        }
        #endregion

        #region 绘制表格

        ///
        /// <summary>
        /// p为左上角点;
        /// height为表格的高度;
        /// width为表格的宽度;
        /// tab为需要绘制的表格;
        /// b 为是否自动换行;
        /// cellHeight为列的宽度百分比;
        /// fonttype为表格内容是左对齐还是右对齐或者居中对齐
        /// </summary>
        /// 

        public void DrawTab(Point p, int height, int width, DataTable tab)
        {
            DrawTab(p, height, width, tab, false);
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, bool b)
        {
            float w = width / tab.Columns.Count;
            float[] col = new float[tab.Columns.Count];
            for (int i = 0; i < tab.Columns.Count; i++)
            {
                col[i] = w / width;
            }
            DrawTab(p, height, width, tab, b, col);
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, float[] CellHeight)
        {
            DrawTab(p, height, width, tab, false, CellHeight);
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, float[] CellHeight, FontType fonttype)
        {
            DrawTab(p, height, width, tab, false, CellHeight, fonttype);
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight)
        {
            DrawTab(p, height, width, tab, false, CellHeight, FontType.middle);
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, FontType fonttype)
        {
            int iFont = 0;
            DrawTab(p, height, width, tab, b, CellHeight, iFont, fonttype);
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, FontType fonttype,bool flg)
        {
            int iFont = 0;
            DrawTab(p, height, width, tab, b, CellHeight, iFont, fonttype,flg );
        }
        public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype)
        {
            if (tab == null)
                return;

            height += 1; // 补偿偏移
            #region 先绘制一个矩形框
            DrawRect(p, width, height);
            #endregion

            #region 绘制表头
            int col = tab.Columns.Count;
            int x = p.X;
            int y = (int)_fYPosition;
            float maxh = 0;
            for (int i = 0; i < tab.Columns.Count; i++)
            {
                DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
                x += (int)(CellHeight[i] * width);
                if (maxh < _fYPosition - y)
                {
                    maxh = (int)_fYPosition - y;
                }
                _fYPosition = y;
                if (i != tab.Columns.Count - 1)
                {
                    Point p1 = new Point();
                    p1.X = x;
                    p1.Y = p.Y;
                    Point p2 = new Point();
                    p2.X = x;
                    p2.Y = p.Y + height;
                    DrawLine(p1, p2);
                }
            }
            _fYPosition += maxh;
            Point po1 = new Point();
            po1.X = p.X;
            po1.Y = (int)_fYPosition;
            Point po2 = new Point();
            po2.X = p.X + width;
            po2.Y = (int)_fYPosition;
            DrawLine(po1, po2);
            #endregion

            #region 绘制表明细
            beginrow = irow;
            for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
            {
                #region 初始化初值
                x = p.X;
                y = (int)_fYPosition;
                maxh = 0;
                #endregion

                #region 绘制列
                for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                {
                    DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
                    x += (int)(CellHeight[iCol] * width);
                    if (maxh < _fYPosition - y)
                    {
                        maxh = _fYPosition - y;
                    }
                    _fYPosition = y;
                }
                _fYPosition += maxh;
                endrow = iRow;
                #endregion

                #region 判断是否分页
                if (iRow + 1 != tab.Rows.Count)
                {
                    int pagenum = _PageNumber;
                    for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                    {
                        int iLine = 0;
                        if (b)
                        {
                            float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
                            while (W > 0)
                            {
                                iLine++;
                                W -= (CellHeight[iCol] * width);
                            }
                        }
                        else
                        {
                            iLine = 1;
                        }
                        if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
                        {
                            irow = iRow + 1;
                            _PageNumber++;
                            break;
                        }
                    }
                    if (pagenum != _PageNumber)
                        return;
                }
                #endregion

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion
            }
            #endregion

            #region 将表格填满
            do
            {
                krow++;

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion

                _fYPosition += sysFont.GetHeight(myGr);
            }
            while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
            #endregion
        }

        public void DrawTab1(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype)
        {
            if (tab == null)
                return;

            height += 1; // 补偿偏移
            #region 先绘制一个矩形框
            DrawRect(p, width, height);
            #endregion

            #region 绘制表头
            int col = tab.Columns.Count;
            int x = p.X;
            int y = (int)_fYPosition;
            float maxh = 0;
            for (int i = 0; i < tab.Columns.Count; i++)
            {
                DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
                x += (int)(CellHeight[i] * width);
                if (maxh < _fYPosition - y)
                {
                    maxh = (int)_fYPosition - y;
                }
                _fYPosition = y;
                if (i != tab.Columns.Count - 1)
                {
                    Point p1 = new Point();
                    p1.X = x;
                    p1.Y = p.Y;
                    Point p2 = new Point();
                    p2.X = x;
                    p2.Y = p.Y + height;
                    DrawLine(p1, p2);
                }
            }
            _fYPosition += maxh;
            Point po1 = new Point();
            po1.X = p.X;
            po1.Y = (int)_fYPosition;
            Point po2 = new Point();
            po2.X = p.X + width;
            po2.Y = (int)_fYPosition;
            DrawLine(po1, po2);
            #endregion

            #region 绘制表明细
            beginrow = irow;
            for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
            {
                #region 初始化初值
                x = p.X;
                y = (int)_fYPosition;
                maxh = 0;
                #endregion

                #region 绘制列
                for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                {
                    DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
                    x += (int)(CellHeight[iCol] * width);
                    if (maxh < _fYPosition - y)
                    {
                        maxh = _fYPosition - y;
                    }
                    _fYPosition = y;
                }
                _fYPosition += maxh;
                endrow = iRow;
                #endregion

                #region 判断是否分页
                if (iRow + 1 != tab.Rows.Count)
                {
                    int pagenum = _PageNumber;
                    for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                    {
                        int iLine = 0;
                        if (b)
                        {
                            float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
                            while (W > 0)
                            {
                                iLine++;
                                W -= (CellHeight[iCol] * width);
                            }
                        }
                        else
                        {
                            iLine = 1;
                        }
                        if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
                        {
                            _bPages = true;
                            dlg.DialogResult = DialogResult.Cancel;
                            MessageBox.Show("此放行条需分页打印,请重新打印");
                            irow = iRow + 1;
                            _PageNumber++;
                            break;
                        }
                        
                    }
                    if (pagenum != _PageNumber)
                        return;
                }
                #endregion

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion
            }
            #endregion

            #region 将表格填满
            do
            {
                krow++;

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion

                _fYPosition += sysFont.GetHeight(myGr);
            }
            while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
            #endregion
        }

        public void DrawTab2(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype)
        {
            if (tab == null)
                return;

            height += 1; // 补偿偏移
            #region 先绘制一个矩形框
            DrawRect(p, width, height);
            #endregion

            #region 绘制表头
            int col = tab.Columns.Count;
            int x = p.X;
            int y = (int)_fYPosition;
            float maxh = 0;
            for (int i = 0; i < tab.Columns.Count; i++)
            {
                DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
                x += (int)(CellHeight[i] * width);
                if (maxh < _fYPosition - y)
                {
                    maxh = (int)_fYPosition - y;
                }
                _fYPosition = y;
                if (i != tab.Columns.Count - 1)
                {
                    Point p1 = new Point();
                    p1.X = x;
                    p1.Y = p.Y;
                    Point p2 = new Point();
                    p2.X = x;
                    p2.Y = p.Y + height;
                    DrawLine(p1, p2);
                }
            }
            _fYPosition += maxh;
            Point po1 = new Point();
            po1.X = p.X;
            po1.Y = (int)_fYPosition;
            Point po2 = new Point();
            po2.X = p.X + width;
            po2.Y = (int)_fYPosition;
            DrawLine(po1, po2);
            #endregion

            #region 绘制表明细
            beginrow = irow;
            for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
            {
                #region 初始化初值
                x = p.X;
                y = (int)_fYPosition;
                maxh = 0;
                #endregion

                #region 绘制列
                for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                {
                    DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
                    x += (int)(CellHeight[iCol] * width);
                    if (maxh < _fYPosition - y)
                    {
                        maxh = _fYPosition - y;
                    }
                    _fYPosition = y;
                }
                _fYPosition += maxh;
                endrow = iRow;
                #endregion

                #region 判断是否分页
                //if (iRow + 1 != tab.Rows.Count)
                //{
                //    int pagenum = _PageNumber;
                //    for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                //    {
                //        int iLine = 0;
                //        if (b)
                //        {
                //            float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
                //            while (W > 0)
                //            {
                //                iLine++;
                //                W -= (CellHeight[iCol] * width);
                //            }
                //        }
                //        else
                //        {
                //            iLine = 1;
                //        }
                //        if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
                //        {
                //            dlg.DialogResult = DialogResult.Cancel;
                //            MessageBox.Show("此放行条需分页打印,请重新打印");
                //            irow = iRow + 1;
                //            _PageNumber++;
                //            break;
                //        }

                //    }
                //    if (pagenum != _PageNumber)
                //        return;
                //}
                #endregion

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion
            }
            #endregion

            #region 将表格填满
            do
            {
                krow++;

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion

                _fYPosition += sysFont.GetHeight(myGr);
            }
            while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
            #endregion
        }
        /// <summary>
        /// 绘制表
        /// </summary>
        /// <param name="p">起绘点</param>
        /// <param name="height">高度</param>
        /// <param name="width">宽度</param>
        /// <param name="tab">DatatTable表</param>
        /// <param name="b">是否换行</param>
        /// <param name="CellHeight">列宽比例</param>
        /// <param name="iFont">字体</param>
        /// <param name="fonttype">字体对齐</param>
        /// <param name="flg">是否表格填充空白</param>
        public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype, bool flg)
        {
            if (tab == null)
                return;

            height += 1; // 补偿偏移
            #region 先绘制一个矩形框
            DrawRect(p, width, height);
            #endregion

            #region 绘制表头
            int col = tab.Columns.Count;
            int x = p.X;
            int y = (int)_fYPosition;
            float maxh = 0;
            for (int i = 0; i < tab.Columns.Count; i++)
            {
                DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
                x += (int)(CellHeight[i] * width);
                if (maxh < _fYPosition - y)
                {
                    maxh = (int)_fYPosition - y;
                }
                _fYPosition = y;
                if (i != tab.Columns.Count - 1)
                {
                    Point p1 = new Point();
                    p1.X = x;
                    p1.Y = p.Y;
                    Point p2 = new Point();
                    p2.X = x;
                    p2.Y = p.Y + (int)sysFont.GetHeight(myGr);
                    DrawLine(p1, p2);
                }
            }
            _fYPosition += maxh;
            Point po1 = new Point();
            po1.X = p.X;
            po1.Y = (int)_fYPosition;
            Point po2 = new Point();
            po2.X = p.X + width;
            po2.Y = (int)_fYPosition;
            DrawLine(po1, po2);
            #endregion

            #region 绘制表明细
            beginrow = irow;
            for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
            {
                #region 初始化初值
                x = p.X;
                y = (int)_fYPosition;
                maxh = 0;
                #endregion

                #region 绘制列
                for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                {
                    DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
                    x += (int)(CellHeight[iCol] * width);
                    if (maxh < _fYPosition - y)
                    {
                        maxh = _fYPosition - y;
                    }
                    _fYPosition = y;
                    if (iCol != tab.Columns.Count - 1)
                    {
                        Point p21 = new Point();
                        p21.X = x;
                        p21.Y = p.Y;
                        Point p22 = new Point();
                        p22.X = x;
                        p22.Y = p.Y + (int)sysFont.GetHeight(myGr);
                        DrawLine(p21, p22);
                    }
                }
                _fYPosition += maxh;
                endrow = iRow;
                #endregion

                #region 判断是否分页
                if (iRow + 1 != tab.Rows.Count)
                {
                    int pagenum = _PageNumber;
                    for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
                    {
                        int iLine = 0;
                        if (b)
                        {
                            float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
                            while (W > 0)
                            {
                                iLine++;
                                W -= (CellHeight[iCol] * width);
                            }
                        }
                        else
                        {
                            iLine = 1;
                        }
                        if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
                        {
                            irow = iRow + 1;
                            _PageNumber++;
                            break;
                        }
                    }
                    if (pagenum != _PageNumber)
                        return;
                }
                #endregion

                #region 绘制横线
                Point p1 = new Point();
                p1.X = p.X;
                p1.Y = (int)_fYPosition;
                Point p2 = new Point();
                p2.X = p.X + width;
                p2.Y = (int)_fYPosition;
                DrawLine(p1, p2);
                #endregion
            }
            #endregion

            #region 将表格填满
            if (flg)
            {
                do
                {
                    krow++;

                    #region 绘制横线
                    Point p1 = new Point();
                    p1.X = p.X;
                    p1.Y = (int)_fYPosition;
                    Point p2 = new Point();
                    p2.X = p.X + width;
                    p2.Y = (int)_fYPosition;
                    DrawLine(p1, p2);
                    #endregion

                    _fYPosition += sysFont.GetHeight(myGr);
                }
                while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
            }
            else _fYPosition = p.Y + height - sysFont.GetHeight(myGr);

            #endregion
        }


        #endregion

        #endregion

        #region 标题
        #endregion

        #region 页眉
        public void DrawHead()
        {

        }
        #endregion

        #region 页脚
        public void DrawFoot()
        {
        }
        #endregion

        #endregion

        public void ShowPrint()
        {
            print = new PrintDocument();
            print.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(onPrint);
            print.BeginPrint += new System.Drawing.Printing.PrintEventHandler(beginPrint);
            PageSetupDialog psdlg = new PageSetupDialog();
            print.DefaultPageSettings = _pageSize;
            print.DocumentName = _PrintDocumentName;
            print.DefaultPageSettings.Landscape = pageFace;

            irow = 0;     //表格每页的开始行数
            beginrow = 0;     //表格每页的开始行数
            endrow = 0;       //表格每页的结束行数
            krow = 0;
            _PageNumber = _PageNum - 1;
            if (_PageNumber < 0)
            {
                _PageNumber = 0;
            }
            _PageN = 0;

            dlg = new PrintPreviewDialog();
            dlg.Document = print;
            dlg.PrintPreviewControl.Zoom = 1;
            try
            {
                ((System.Windows.Forms.Form)dlg).WindowState = FormWindowState.Maximized;
                dlg.ShowDialog();
            }
            catch
            {
                ;
            }
        }

        public void ShowPrint(UPrintPreviewDialog dlg)
        {
            print = new PrintDocument();
            print.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(onPrint);
            print.BeginPrint += new System.Drawing.Printing.PrintEventHandler(beginPrint);
            PageSetupDialog psdlg = new PageSetupDialog();
            print.DefaultPageSettings = _pageSize;
            print.DocumentName = _PrintDocumentName;
            print.DefaultPageSettings.Landscape = pageFace;

            irow = 0;     //表格每页的开始行数
            beginrow = 0;     //表格每页的开始行数
            endrow = 0;       //表格每页的结束行数
            krow = 0;
            _PageNumber = _PageNum - 1;
            if (_PageNumber < 0)
            {
                _PageNumber = 0;
            }
            _PageN = 0;

            dlg.Document = print;
            dlg.PrintPreviewControl.Zoom = 1;
            try
            {
                ((System.Windows.Forms.Form)dlg).WindowState = FormWindowState.Maximized;
                dlg.ShowDialog();
            }
            catch
            {
                ;
            }
        }
        
        public int GetPageBeginRow()
        {
            return beginrow;
        }
        public int GetPageEndRow()
        {
            return endrow;
        }
        public int GetPageKRow()
        {
            return krow;
        }
        public float GetTextWidth(string str)
        {
            return myGr.MeasureString(str, sysFont).Width;
        }

        #endregion

        #endregion
    }
View Code
原文地址:https://www.cnblogs.com/zlcom/p/3499109.html