通用表格打印1

//
// =================================================
//   通用表格打印
//   
//    设计: 陈炎和 2011.03
//==================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Collections;
using System.Data;

namespace cyh.General

    /// <summary>
    /// 通用表格打印
    /// 调用时先设置主体,再增加标题和字段
    /// </summary>
    public class ctlTableReport:PrintDocument,iTableReport
    {
        internal PrintPreviewDialog previewDialog = new PrintPreviewDialog();
     

        #region 定义属性
       
    
        /// <summary>
        /// 报表主体
        /// </summary>
        private ReportMain m_rpm = new ReportMain();
        /// <summary>
        /// 报表标题
        /// </summary>
        private  List<ReportTitle>  m_rpt = new List<ReportTitle>();
        /// <summary>
        /// 报表的字段
        /// </summary>
        private List<ReportField> m_rpf = new List<ReportField>();
        /// <summary>
        /// 实际打印时用的报表头
        /// </summary>
        private  ReportTitle[] m_rpt_print ;
        /// <summary>
        /// 实际打印时用的报表字段
        /// </summary>
        private  ReportField[] m_rpf_print ;
        /// <summary>
        /// 条码
        /// </summary>
        private ReportBarcode m_rpb = new ReportBarcode();

        /// <summary>
        /// 表头坐标
        /// </summary>
        private Rectangle m_header;
        /// <summary>
        /// 表格坐标
        /// </summary>
        private Rectangle m_detail;
        /// <summary>
        /// 表底坐标
        /// </summary>
        private Rectangle m_footer; 
        /// <summary>
        /// 打印的边距
        /// </summary>
        private Margins Margins { get; set; }
        /// <summary>
        /// 纸张大小
        /// </summary>
        private PaperSize PaperSize { get; set; }
        /// <summary>
        /// 条码打印类
        /// </summary>
        private BarCode128 m_BarCode128 = new BarCode128();
        /// <summary>
        /// 数据源
        /// </summary>
        public DataTable DataSource { get; set; }

        #endregion

        /// <summary>
        /// 预留边线的宽度
        /// </summary>
        private const int c_LineWidth = 3;
        private int m_PageIndex,m_PageCount,m_rowindex;


        /// <summary>
        /// 定义报表主体同时创建报表
        /// </summary>
        /// <param name="DetailHeight">明细每行高度</param>
        /// <param name="DetailRows">每页行数(0:自动计算)</param>
        /// <param name="GridLine">表格线的类型 1:三栏表,2:有边框的三栏,4:完全网格</param>
        /// <param name="Align">表格对齐方向</param>
        /// <param name="Landscape">横向还是纵向打印</param>
        /// <param name="Margins">页的边距尺寸</param>
        /// <param name="PaperKind">标准的纸张大小(pageSize为空时有效)</param>
        /// <param name="pageSize">纸张大小</param>
        /// <param name="FromPage">起始页</param>
        /// <param name="ToPage">结束页(0:自动到最后一页)</param>
        /// <param name="printerName">打印机名(为空时用自动选择)</param>
        /// <param name="AutoPageHeight">根据行高度及行数计算纸长,不支持横向打印</param>
        /// <param name="Pages">每页的小页数</param>
        public void SetReportMain(int DetailHeight, int DetailRows, ReportGridLine GridLine, StringAlignment Align, bool Landscape, System.Drawing.Printing.Margins Margins,
            System.Drawing.Printing.PaperKind PaperKind, Size pageSize, int FromPage, int ToPage, string printerName,bool AutoPageHeight,int Pages)
        {
            if (AutoPageHeight && DetailRows == 0)
                throw new Exception("自动页长时每页行数必须大于0");
            m_rpm.DetailHeight = DetailHeight;
            m_rpm.DetailRows = DetailRows;
            m_rpm.Align = Align;
            m_rpm.Landscape = Landscape;
            m_rpm.Margins = Margins;
            m_rpm.PaperKind = PaperKind;
            m_rpm.pageSize = pageSize;
            m_rpm.BeginPage = FromPage;
            m_rpm.EndPage = ToPage;
            m_rpm.printerName = printerName;
            m_rpm.GridLine = GridLine;
            m_rpm.AutoPageHeight = AutoPageHeight;
            m_rpm.Pages = Pages<1?1:Pages;
        }

        public void SetReportMain(int DetailHeight, int DetailRows, ReportGridLine GridLine, Size pageSize, int FromPage, string printerName, int Pages)
        {
            SetReportMain(DetailHeight, DetailRows,GridLine, StringAlignment.Center, false, new System.Drawing.Printing.Margins(80, 80, 100, 80), System.Drawing.Printing.PaperKind.Custom, pageSize, FromPage, 0, printerName,false, 1);           
        }
        public void SetReportMain(int DetailHeight, ReportGridLine GridLine, Size pageSize, int FromPage, string printerName)
        {
            SetReportMain(DetailHeight, 0, GridLine, pageSize, FromPage, printerName,1);
        }

      

        /// <summary>
        /// 定义报表标题
        /// </summary>
        /// <param name="Caption">标题内容</param>
        /// <param name="Header">页头或页脚</param>
        /// <param name="Font">字体(宋体加粗四号)</param>
        /// <param name="TextAlignment">对齐方式</param>
        /// <param name="size"> 标题的高度和宽度,若不定义便检测Caption,否则自换行</param>
        public void AddReportTitle(string Caption, bool Header, Font Font, StringAlignment TextAlignment, System.Drawing.Size size)
        {
            ReportTitle rpt = new ReportTitle();
            rpt.Caption = Caption;
            rpt.Header = Header;
            rpt.TextAlignment = TextAlignment;
            rpt.Font = Font == null ? new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))) : Font;
            rpt.size = size;
            m_rpt.Add(rpt);
        }
        /// <summary>
        /// 定义报表标题
        /// </summary>
        /// <param name="Caption">标题内容</param>
        /// <param name="Header">页头或页脚</param>
        public void AddReportTitle(string Caption, bool Header)
        {
            AddReportTitle(Caption, Header, null, StringAlignment.Near, Size.Empty);
        }
        /// <summary>
        /// 定义报表字段
        /// </summary>
        /// <param name="Caption">表格头标题</param>
        /// <param name="HeaderFont">标题字体(宋体、小四)</param>
        /// <param name="Field">绑定字段</param>
        /// <param name="TextAlignment">对齐方式</param>
        /// <param name="DetailFont"> 表格字体(宋体、小四)</param>
        /// <param name="WordWrap">自动换行</param>
        /// <param name="Bottom">表格脚内容</param>
        /// <param name="Sum">是否合计</param>
        /// <param name="FormatString">格式化字符串</param>
        /// <param name="HeaderSize">标题的高度和宽度,若不定义便检测Caption,否则自换行并居中</param>
        public void AddReportField(string Caption, Font HeaderFont, string Field, StringAlignment TextAlignment, Font DetailFont
                        , bool WordWrap, string Bottom, bool Sum, string FormatString, Size HeaderSize)
        {
            ReportField rpf = new ReportField();
            rpf.Caption = Caption;
            rpf.HeaderFont = HeaderFont;
            rpf.Field = Field;
            rpf.TextAlignment = TextAlignment;
            rpf.DetailFont = DetailFont;
            rpf.WordWrap = WordWrap;
            rpf.Bottom = Bottom;
            rpf.Sum = Sum;
            rpf.FormatString = FormatString;
            rpf.HeaderSize = HeaderSize;
            m_rpf.Add(rpf);
        }
        /// <summary>
        /// 定义报表字段
        /// </summary>
        /// <param name="Caption">表格头标题</param>
        /// <param name="Field">绑定字段</param>
        public void AddReportField(string Caption,string Filed)
        {
            AddReportField(Caption,null,Filed, StringAlignment.Near, null, false, "", false, string.Empty, Size.Empty);           
        }
        /// <summary>
        /// 定义条码
        /// </summary>
        /// <param name="Text">条码内容(A-Z,0-9)</param>
        /// <param name="pint">起点</param>
        /// <param name="size">大小</param>
        /// <param name="showText">是否显示文字</param>
        /// <param name="Field">字段名</param>
        public void SetReportBarCode(string Text, Point pint, Size size, bool showText,string Field)
        {
            m_rpb.Text = Text;
            m_rpb.pint = pint;
            m_rpb.size =size;
            m_rpb.showText = showText;
            m_rpb.Field = Field;
        }               
        /// <summary>
        /// 报表每个单元打印前事件
        /// </summary>
        public event ReportUnitAfterPrint UnitAfterPrint;

        public ctlTableReport()
        {
            previewDialog.Document = this;    
        }
        /// <summary>
        /// 显示打印
        /// </summary>
        /// <returns></returns>
        public void  ShowDialog()
        {
           previewDialog.ShowDialog();
        }
        /// <summary>
        /// 显示打印
        /// </summary>
        /// <param name="owner"></param>
        /// <returns></returns>
        public void  ShowDialog(IWin32Window owner)
        {
            previewDialog.ShowDialog(owner);
        }

        /// <summary>
        /// 自动页长时计算每页打印的行数
        /// </summary>
        /// <param name="rows">总行数</param>
        /// <param name="maxrow">充许每页打印最大行数</param>
        /// <returns></returns>
        public int GetAutoRow(int rows, int maxrow)
        {
            if (rows % maxrow == 0)
                return maxrow;
            else
            {
                //找余数为0或最接近最大行数
                List<int> m = new List<int>();
                for (int i = maxrow; i >=maxrow * 3 / 4; i--)
                {
                    m.Add(rows % i);                      
                    if (rows % i == 0)   return i;                   
                }
                int k = m.AsEnumerable().Max();
                for (int i = 0; i < m.Count(); i++)
                {
                    if (m[i] == k)  return maxrow - i;//只能最接近了
                }
                return  maxrow;
            }
        }

        protected override void OnBeginPrint(PrintEventArgs e)
        {
            m_rpt_print = m_rpt.ToArray();
            m_rpf_print = m_rpf.ToArray();           
            m_PageIndex = 0;
            m_rowindex = 0;
            //设置页面
            if (m_rpm.Margins != null)
            {               
                this.Margins = m_rpm.Margins;
                this.DefaultPageSettings.Margins.Left = this.Margins.Left * 100 / 254; this.DefaultPageSettings.Margins.Right = this.Margins.Right * 100 / 254;  this.DefaultPageSettings.Margins.Top = this.Margins.Top * 100 / 254;  this.DefaultPageSettings.Margins.Bottom = this.Margins.Bottom * 100 / 254;
            }
            else
                this.Margins = new Margins((int)(base.DefaultPageSettings.Margins.Left * 2.54F), (int)(base.DefaultPageSettings.Margins.Right * 2.54F), (int)(base.DefaultPageSettings.Margins.Top * 2.54F), (int)(base.DefaultPageSettings.Margins.Bottom * 2.54F));
            if (!m_rpm.pageSize.IsEmpty)
            {
                this.PaperSize = new PaperSize("x", m_rpm.pageSize.Width, m_rpm.pageSize.Height);
                base.DefaultPageSettings.PaperSize = new PaperSize("x", m_rpm.pageSize.Width * 100 / 254, m_rpm.pageSize.Height * 100 / 254);
            }
            else
            {
                foreach (PaperSize ps in base.DefaultPageSettings.PrinterSettings.PaperSizes)
                    if (ps.Kind == m_rpm.PaperKind) base.DefaultPageSettings.PaperSize = ps;
                this.PaperSize = new PaperSize("x", (int)(base.DefaultPageSettings.PaperSize.Width * 2.54F),(int)(base.DefaultPageSettings.PaperSize.Height * 2.54F));
            }
            base.DefaultPageSettings.Landscape = m_rpm.Landscape;
            if (!string.IsNullOrEmpty(m_rpm.printerName))
                base.PrinterSettings.PrinterName = m_rpm.printerName;

            Graphics g = this.PrinterSettings.CreateMeasurementGraphics();
            InitPrint(g, ref m_rpt_print, ref m_rpf_print);       
            //计算总页数
            m_PageCount = this.DataSource.Rows.Count / m_rpm.DetailRows;
            if (this.DataSource.Rows.Count % m_rpm.DetailRows  != 0) m_PageCount++;//总行数 = m_PageCount * m_rpm.DetailRows
           
            base.OnBeginPrint(e);
        }
        //打印首页时初始化打印设置
        private void InitPrint(Graphics g,ref ReportTitle[] rpt,ref ReportField[] rpf)
        {
            m_header = new Rectangle();
            m_header.Y = this.Margins.Top;
            int pageFooderHeight = 0;
            bool tableFooter = false;//是否要打印表底
            g.PageUnit = GraphicsUnit.Millimeter;
            for (int i = 0; i < rpt.Length; i++)
            {               
                if (rpt[i].TextAlignment == 0) rpt[i].TextAlignment = StringAlignment.Near;
                if (rpt[i].Font == null) rpt[i].Font = new System.Drawing.Font("宋体", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                if (rpt[i].size.IsEmpty)
                    rpt[i].size = new Size(this.PaperSize.Width / m_rpm.Pages - this.Margins.Left - this.Margins.Right, (int)(g.MeasureString(rpt[i].Caption, rpt[i].Font).Height * 10) + 2);
                if (rpt[i].Header) m_header.Y += rpt[i].size.Height;//表格起点
                else pageFooderHeight += rpt[i].size.Height;
            }
            m_header.Y += c_LineWidth;
            for (int i = 0; i < rpf.Length; i++)
            {
                if (rpf[i].TextAlignment == 0) rpf[i].TextAlignment = StringAlignment.Near;
                if (rpf[i].HeaderFont == null) rpf[i].HeaderFont = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                if (rpf[i].DetailFont == null) rpf[i].DetailFont = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                if (rpf[i].HeaderSize.IsEmpty)
                {
                    SizeF size = g.MeasureString(rpf[i].Caption, rpf[i].HeaderFont);
                    size.Height = size.Height < m_rpm.DetailHeight /10F ? m_rpm.DetailHeight/10F : size.Height * 1.1F;
                    rpf[i].HeaderSize = new Size((int)(size.Width * 10) + (i == 0 ? 3 : 2) * c_LineWidth, (int)(size.Height * 10)); //宽度增加2个线位,防止自动换行                 
                }
                m_header.Height = m_header.Height < rpf[i].HeaderSize.Height ? rpf[i].HeaderSize.Height : m_header.Height;
                m_header.Width += rpf[i].HeaderSize.Width; //表格宽度
                if (!string.IsNullOrEmpty(rpf[i].Bottom) || rpf[i].Sum) tableFooter = true;
            }            
            switch (m_rpm.Align)
            {
                case StringAlignment.Center:
                    m_header.X = (this.PaperSize.Width/m_rpm.Pages - this.Margins.Left - this.Margins.Right - m_header.Width) / 2;
                    break;
                case StringAlignment.Far:
                    m_header.X = this.PaperSize.Width/m_rpm.Pages - this.Margins.Left - this.Margins.Right - m_header.Width - c_LineWidth;
                    break;
                default:
                    m_header.X = this.Margins.Left ;
                    break;
            }                     
            // 检测行数和行高
            int h = m_header.Height + m_header.Y + 2 * c_LineWidth + (tableFooter ? m_rpm.DetailHeight + c_LineWidth : 0)+pageFooderHeight+2*c_LineWidth;
            //自动页长=页头+页脚+每页行数 * 每行高度
            if (m_rpm.AutoPageHeight && m_rpm.DetailRows >0 )
            {
                int pH = h + m_rpm.DetailRows * m_rpm.DetailHeight + this.Margins.Bottom;
                this.PaperSize = new PaperSize("x", this.PaperSize.Width, pH);
                base.DefaultPageSettings.PaperSize = new PaperSize("x", this.PaperSize.Width * 100 / 254, this.PaperSize.Height * 100 / 254);               
            }

            h = this.PaperSize.Height - this.Margins.Bottom - h;
            if (m_rpm.DetailRows == 0)  //计算扣除页头页脚及表头表底后行,计算每页行数
            {
                m_rpm.DetailRows = h / m_rpm.DetailHeight;
                if (m_rpm.DetailRows <= 0) throw new Exception("PageHeight不够大,请重新定义纸张大小,或减少DetailHeight");
            }
            if (m_rpm.DetailRows * m_rpm.DetailHeight > h) throw new Exception("PageHeight不够大,请重新定义纸张大小,或减少DetailRows");

            m_detail = new Rectangle(m_header.X, m_header.Y + m_header.Height + c_LineWidth, m_header.Width, m_rpm.DetailHeight * m_rpm.DetailRows);
            if (tableFooter) m_footer = new Rectangle(m_detail.X, m_detail.Y + m_detail.Height + c_LineWidth, m_detail.Width, m_rpm.DetailHeight);
            else m_footer = new Rectangle();

        }

        protected override void OnPrintPage(PrintPageEventArgs e)
        {
            e.Graphics.PageUnit = GraphicsUnit.Millimeter;
            if (m_rpm.BeginPage > 0 && m_PageIndex < m_rpm.BeginPage - 1) m_PageIndex = m_rpm.BeginPage - 1;
            if (m_PageIndex >= m_PageCount)
            {
                base.OnPrintPage(e);
                return;
            }
            int xMove = 0; //每页左移距离
            for (int p = 1; p <= m_rpm.Pages  ; p++)
            {
                xMove = (this.PaperSize.Width / m_rpm.Pages) * (p - 1);
                CreateBarCode(m_rpb, e.Graphics,xMove);
                CreateTitleHeader(m_rpt_print, e.Graphics, this.Margins.Left + xMove   , this.Margins.Top, true);
                CreateTableHeader(m_rpf_print, e.Graphics, m_header.X + xMove , m_header.Y);
                m_rowindex = m_PageIndex * m_rpm.DetailRows;
                DataRow drSum = this.DataSource.NewRow(); //用于本页合计
                for (int i = 0; i < m_rpm.DetailRows; i++)
                {
                    CreateTableDetail(m_rpf_print, e.Graphics, m_detail.X+xMove, m_detail.Y + i * m_rpm.DetailHeight, this.DataSource.Rows[m_rowindex], m_rpm.DetailHeight, drSum);
                    m_rowindex++;
                    if (m_rowindex == this.DataSource.Rows.Count) break;
                }
                //表底           
                if (!m_footer.IsEmpty)
                {
                    CreateTableFooder(m_rpf_print, e.Graphics, m_footer.X+xMove, m_footer.Y, drSum, m_rpm.DetailHeight);
                    CreateTitleHeader(m_rpt_print, e.Graphics, Margins.Left+xMove, m_footer.Y + m_footer.Height + c_LineWidth, false);
                }
                else
                    CreateTitleHeader(m_rpt_print, e.Graphics, Margins.Left+xMove, m_detail.Y + m_detail.Height + c_LineWidth, false);
                //画线
                CreateLine(e.Graphics,xMove);
                m_PageIndex++;
                if ((m_PageIndex < m_PageCount) && !(m_rpm.EndPage > 0 && m_PageIndex >= m_rpm.EndPage))
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                    break;
                }
            }                                                              
            base.OnPrintPage(e);
        }

        /// <summary>
        ///打印表底
        /// </summary>
        private void  CreateTableFooder(ReportField[] rpf, Graphics g, int x,int y , DataRow dr, int rowHeight)
        {
            foreach (ReportField obj in rpf)
            {
                string value = obj.Bottom;
                if (obj.Sum)  //合计
                    if (!string.IsNullOrEmpty(obj.Field))
                    {
                        if (dr[obj.Field] != DBNull.Value &&  !string.IsNullOrEmpty(obj.FormatString))
                            value = string.Format(obj.FormatString, dr[obj.Field]);
                        else if (dr[obj.Field] != DBNull.Value)
                            value = dr[obj.Field].ToString();
                        else value = string.Empty;
                    }                                             
                if (UnitAfterPrint != null) UnitAfterPrint(this,ReportBandType.TableFooter, m_PageIndex, m_PageIndex * m_rpm.DetailRows, obj.Caption, obj.Field, ref value, new EventArgs());
                StringFormat format1 = new StringFormat();
                format1.Alignment = obj.TextAlignment;
                if (!obj.WordWrap) format1.FormatFlags = StringFormatFlags.NoWrap;
                g.DrawString(value, obj.HeaderFont, Brushes.Black, new RectangleF(x/10F, y/10F, obj.HeaderSize.Width/10F, rowHeight/10), format1);
                x = x + obj.HeaderSize.Width + c_LineWidth;              
            }
            return ;
       
        }
        /// <summary>
        ///打印一行(按行的高度不留线宽)
        /// </summary>
        private void  CreateTableDetail(ReportField[] rpf, Graphics g, int x,int y, DataRow dr,int rowHeight,DataRow Sum)
        {
            foreach (ReportField obj in rpf)
            {               
                string value = obj.Caption;
                if (! string.IsNullOrEmpty(obj.Field))
                {
                    if (dr[obj.Field] != DBNull.Value && !string.IsNullOrEmpty(obj.FormatString))
                        value = string.Format(obj.FormatString, dr[obj.Field]);
                    else if (dr[obj.Field] != DBNull.Value)
                        value = dr[obj.Field].ToString();
                    else value = string.Empty;
                   if (obj.Sum)  //合计
                   {                      
                       double d = Sum[obj.Field] == DBNull.Value ? 0 : Convert.ToDouble(Sum[obj.Field]);
                       Sum[obj.Field] = d +(dr[obj.Field] == DBNull.Value ? 0 : Convert.ToDouble(dr[obj.Field]));  //数据类型??
                   }
                }
                if (UnitAfterPrint != null) UnitAfterPrint(this,ReportBandType.TableDetail, m_PageIndex, m_rowindex, obj.Caption, obj.Field, ref value, new EventArgs());              
                StringFormat format1 = new StringFormat();
                format1.Alignment = obj.TextAlignment;
                if (!obj.WordWrap)  format1.FormatFlags = StringFormatFlags.NoWrap ;
                g.DrawString(value, obj.HeaderFont, Brushes.Black, new RectangleF(x/10F, y/10F, obj.HeaderSize.Width/10F, rowHeight/10F), format1);
                x+=obj.HeaderSize.Width;
            }
            return ;
        }

        /// <summary>
        ///打印眉栏(返回眉栏高度)
        /// </summary>
        private void  CreateTableHeader(ReportField[] rpf, Graphics g, int x,int y)
        {  
            foreach (ReportField obj in rpf)
            {
                string value = obj.Caption ;
                if (UnitAfterPrint != null)  UnitAfterPrint(this , ReportBandType.TableHeader, m_PageIndex, m_PageIndex * m_rpm.DetailRows, obj.Caption,obj.Field, ref value, new EventArgs());
                StringFormat format1 = new StringFormat();
                format1.Alignment = obj.TextAlignment;
                //format1.FormatFlags = StringFormatFlags.NoWrap;
                g.DrawString(value, obj.HeaderFont, Brushes.Black, new RectangleF(x / 10F, y / 10F, obj.HeaderSize.Width / 10F, obj.HeaderSize.Height / 10F),format1);
                x += obj.HeaderSize.Width;
            }
            return ;
        }

       
        /// <summary>
        /// 打印表题
        /// </summary>
        private void  CreateTitleHeader(ReportTitle[] rpt, Graphics g, int x,int y,bool Header)
        {
            int height = 0;
            foreach (ReportTitle obj in rpt)
            {
                string value = obj.Caption ;
                if (obj.Header == Header)
                {
                    if (UnitAfterPrint != null) UnitAfterPrint(this, obj.Header ? ReportBandType.PageHeader :ReportBandType.PageFooder, m_PageIndex,m_PageIndex * m_rpm.DetailRows, obj.Caption, "", ref value, new EventArgs());
                    StringFormat format1 = new StringFormat();
                    format1.Alignment =  obj.TextAlignment;
                    format1.FormatFlags = StringFormatFlags.NoWrap;
                    g.DrawString(value, obj.Font, Brushes.Black, new RectangleF(x/10F, y/10F+height/10F, obj.size.Width/10F, obj.size.Height/10F), format1);                   
                    height =height + obj.size.Height;
                }
            }         
            return ;
        }

        private void CreateLine(Graphics g,int xMove)
        {
            if (m_rpm.GridLine == ReportGridLine.Nothing) return;
            Pen pen = new Pen(Brushes.Black,c_LineWidth/10F);
           //水平线
           CreateLineH(g,pen,m_header.X+xMove,m_header.Y,m_header.Width);
           for (int i = 0; i < m_rpm.DetailRows; i++)
           {
              if (m_rpm.GridLine==ReportGridLine.Full|| i==0 ) CreateLineH(g, pen, m_detail.X+xMove, m_detail.Y + m_rpm.DetailHeight * i, m_detail.Width);
           }
           CreateLineH(g, pen, m_detail.X+xMove, m_detail.Y+m_detail.Height, m_detail.Width);
           if (!m_footer.IsEmpty && m_rpm.GridLine==ReportGridLine.Full)
           {
               CreateLineH(g, pen, m_footer.X+xMove, m_footer.Y + m_footer.Height + c_LineWidth, m_footer.Width);
           }
           //垂直
           if (m_rpm.GridLine == ReportGridLine.Three) return;
           int x = m_header.X+xMove;
           int h = m_detail.Height + m_header.Height +  c_LineWidth + (m_rpm.GridLine==ReportGridLine.Full? m_footer.Height:0);
           CreateLineV(g, pen, x, m_header.Y, h);
           foreach (ReportField obj in m_rpf_print)
           {
               x += obj.HeaderSize.Width;
              if (m_rpm.GridLine==ReportGridLine.Full || obj.Equals(m_rpf_print[m_rpf_print.Length-1])) CreateLineV(g, pen, x, m_header.Y, h);
           }
        }
       
        //垂直(向上移一个线宽位)
        private void CreateLineV(Graphics g, Pen p, int x, int y, int h)
        {
            g.DrawLine(p, x / 10F, (y-c_LineWidth) / 10F, x / 10F, (y + h) / 10F);
        }
       
        //水平(向上移一个线宽位)
        private void CreateLineH(Graphics g, Pen p, int x, int y, int w)
        {
            g.DrawLine(p, (x-c_LineWidth/2) / 10F, (y-c_LineWidth) / 10F, (x+w + c_LineWidth/2) / 10F, (y-c_LineWidth) / 10F);
        }

        /// <summary>
        /// 绘制条码
        /// </summary>
        private void CreateBarCode(ReportBarcode rpb, Graphics g,int xMove)
        {
            if ( string.IsNullOrEmpty(rpb.Text) && string.IsNullOrEmpty( rpb.Field)) return;
            string value = rpb.Text;
            if (!string.IsNullOrEmpty(rpb.Field))
            {
                DataRow dr = DataSource.Rows[m_PageIndex * m_rpm.DetailRows];
                if (dr[rpb.Field] != DBNull.Value) value = dr[rpb.Field].ToString();
                else value = string.Empty;
            }
            if (UnitAfterPrint != null) UnitAfterPrint(this,ReportBandType.BarCode, m_PageIndex, m_PageIndex * m_rpm.DetailRows, rpb.Text,rpb.Field, ref value, new EventArgs());
            if (string.IsNullOrEmpty(value)) return;
            int f = 1;//每0.1毫米显示像素
            Image img = m_BarCode128.EncodeBarcode(value, rpb.size.Width * f  , rpb.size.Height * f, rpb.showText);
            g.DrawImage(img, rpb.pint.X / 10F + (this.Margins.Left+xMove) / 10F, rpb.pint.Y / 10F + this.Margins.Top / 10F, rpb.size.Width / 10F, rpb.size.Height / 10F);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值