C# 打印预览 PrintDocument打印、打印预览

        #region 打印预览


        #region 变量 常量
        //以下用户可自定义  
                //当前要打印文本的字体及字号  
                private const int HeadHeight = 40;
                private static readonly Font TableFont = new Font("Verdana", 10, FontStyle.Regular);
                private readonly SolidBrush _drawBrush = new SolidBrush(Color.Black);
                //表头字体  
                private readonly Font _headFont = new Font("Verdana", 20, FontStyle.Bold);
                //表头文字  
                private readonly int _yUnit = TableFont.Height * 2;
                public int TotalNum = 0;
                //以下为模块内部使用  
                private DataRow _dataRow;
                private DataTable _dataTable;
                private int _firstPrintRecordNumber;
                private string _headText = string.Empty;
                private int _pBottom;
                private int _pHeigh;
                //当前要所要打印的记录行数,由计算得到  
                private int _pageLeft;
                private int _pRight;
                private int _pageTop;
                private int _pWidth;
                private int _pageRecordNumber;
                private PrintDocument _printDocument;
                private PageSetupDialog _pageSetupDialog;
                private int _printRecordComplete;
                //每页打印的记录条数  
                private int _printRecordNumber;
                private int _printingPageNumber = 1;
                //第一页打印的记录条数  
                //与列名无关的统计数据行的类目数(如,总计,小计......)  
                private int _totalPage;
                private int[] _xUnit;
        
        #endregion

                /// <summary>  
                ///     打印  
                /// </summary>  
                /// <param name="dt">要打印的DataTable</param>  
                /// <param name="title">打印文件的标题</param>  
                public void Print(DataTable dt, string title)
                {
                    try
                    {
                        CreatePrintDocument(dt, title).Print();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("打印错误,请检查打印设置!");
                    }
                }  


        /// <summary>  
        ///     打印预览  
        /// </summary>  
        /// <param name="dt">要打印的DataTable</param>  
        /// <param name="title">打印文件的标题</param>  
        public void PrintPriview(DataTable dt, string title)
        {
            try
            {
                var printPriview = new PrintPreviewDialog
                {
                    Document = CreatePrintDocument(dt, title),
                    WindowState = FormWindowState.Maximized
                };
                printPriview.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show("打印错误,请检查打印设置!");
            }
        }
        public void PrintSetting()
        {
            try
            {
                _pageSetupDialog.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show("打印错误,请检查打印设置!");
            }
        }  



        /// <summary>  
        ///     创建打印文件  
        /// </summary>  
        private PrintDocument CreatePrintDocument(DataTable dt, string title)
        {
            _dataTable = dt;
            _headText = title;

            var pageSetup = new PageSetupDialog();

            _printDocument = new PrintDocument { DefaultPageSettings = pageSetup.PageSettings };
            _printDocument.DefaultPageSettings.Landscape = true; //设置打印横向还是纵向  
            //PLeft = 30; //DataTablePrinter.DefaultPageSettings.Margins.Left;  
            _pageTop = _printDocument.DefaultPageSettings.Margins.Top;
            //PRight = DataTablePrinter.DefaultPageSettings.Margins.Right;  
            _pBottom = _printDocument.DefaultPageSettings.Margins.Bottom;
            _pWidth = _printDocument.DefaultPageSettings.Bounds.Width;
            _pHeigh = _printDocument.DefaultPageSettings.Bounds.Height;
            _xUnit = new int[_dataTable.Columns.Count];
            _printRecordNumber = Convert.ToInt32((_pHeigh - _pageTop - _pBottom - _yUnit) / _yUnit);
            _firstPrintRecordNumber = Convert.ToInt32((_pHeigh - _pageTop - _pBottom - HeadHeight - _yUnit) / _yUnit);

            if (_dataTable.Rows.Count > _printRecordNumber)
            {
                if ((_dataTable.Rows.Count - _firstPrintRecordNumber) % _printRecordNumber == 0)
                {
                    _totalPage = (_dataTable.Rows.Count - _firstPrintRecordNumber) / _printRecordNumber + 1;
                }
                else
                {
                    _totalPage = (_dataTable.Rows.Count - _firstPrintRecordNumber) / _printRecordNumber + 2;
                }
            }
            else
            {
                _totalPage = 1;
            }

            _printDocument.PrintPage += PrintDocumentPrintPage;
            _printDocument.DocumentName = _headText;

            return _printDocument;
        }  

        
        /// <summary>  
        ///     打印当前页  
        /// </summary>  
        private void PrintDocumentPrintPage(object sende, PrintPageEventArgs @event)  
        {  
            int tableWith = 0;  
            string columnText;  
            var font = new StringFormat { Alignment = StringAlignment.Center };  
            var pen = new Pen(Brushes.Black, 1);//打印表格线格式  
 
            #region 设置列宽  
  
            foreach (DataRow dr in _dataTable.Rows)  
            {  
                for (int i = 0; i < _dataTable.Columns.Count; i++)  
                {  
                    int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(dr[i].ToString().Trim(), TableFont).Width);  
                    if (colwidth > _xUnit[i])  
                    {  
                        _xUnit[i] = colwidth;  
                    }  
                }  
            }  
  
            if (_printingPageNumber == 1)  
            {  
                for (int cols = 0; cols <= _dataTable.Columns.Count - 1; cols++)  
                {  
                    columnText = _dataTable.Columns[cols].ColumnName.Trim();  
                    int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(columnText, TableFont).Width);  
                    if (colwidth > _xUnit[cols])  
                    {  
                        _xUnit[cols] = colwidth;  
                    }  
                }  
            }  
            for (int i = 0; i < _xUnit.Length; i++)  
            {  
                tableWith += _xUnit[i];  
            }  
 
            #endregion  
  
            _pageLeft = (@event.PageBounds.Width - tableWith) / 2;  
            int x = _pageLeft;  
            int y = _pageTop;  
            int stringY = _pageTop + (_yUnit - TableFont.Height) / 2;  
            int rowOfTop = _pageTop;  
  
            //第一页  
            if (_printingPageNumber == 1)  
            {  
                //打印表头  
                var arr = _headText.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries);  
                if (arr.Length > 1)  
                {  
                    @event.Graphics.DrawString(arr[0],  
                        _headFont,  
                        _drawBrush,  
                        new Point(@event.PageBounds.Width / 2, _pageTop), font);  
                }  
                //副标题  
                var subtitleHeight = 0;  
                for (int i = 1; i < arr.Length; i++)  
                {  
                    @event.Graphics.DrawString(arr[i],  
                        new Font("Verdana", 12, FontStyle.Regular),  
                        _drawBrush,  
                        new Point(@event.PageBounds.Width / 2, _pageTop + _headFont.Height),  
                        font);  
                    subtitleHeight += new Font("Verdana", 12, FontStyle.Regular).Height;  
                }  
  
                //设置为第一页时行数   
                if (_dataTable.Rows.Count < _firstPrintRecordNumber)  
                {  
                    _pageRecordNumber = _dataTable.Rows.Count;  
                }  
                else  
                {  
                    _pageRecordNumber = _firstPrintRecordNumber;  
                }  
  
                rowOfTop = y = (_pageTop + _headFont.Height + subtitleHeight + 10);  
                stringY = _pageTop + _headFont.Height + subtitleHeight + 10 + (_yUnit - TableFont.Height) / 2;  
            }  
            else  
            {  
                //计算,余下的记录条数是否还可以在一页打印,不满一页时为假  
                if (_dataTable.Rows.Count - _printRecordComplete >= _printRecordNumber)  
                {  
                    _pageRecordNumber = _printRecordNumber;  
                }  
                else  
                {  
                    _pageRecordNumber = _dataTable.Rows.Count - _printRecordComplete;  
                }  
            }  
 
            #region 列名  
  
            if (_printingPageNumber == 1 || _pageRecordNumber > TotalNum) //最后一页只打印统计行时不打印列名  
            {  
                //得到datatable的所有列名  
                for (int cols = 0; cols <= _dataTable.Columns.Count - 1; cols++)  
                {  
                    columnText = _dataTable.Columns[cols].ColumnName.Trim();  
  
                    int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(columnText, TableFont).Width);  
                    @event.Graphics.DrawString(columnText, TableFont, _drawBrush, x, stringY);  
                    x += _xUnit[cols];  
                }  
            }  
 
            #endregion  
  
            @event.Graphics.DrawLine(pen, _pageLeft, rowOfTop, x, rowOfTop);  
            stringY += _yUnit;  
            y += _yUnit;  
            @event.Graphics.DrawLine(pen, _pageLeft, y, x, y);  
  
            //当前页面已经打印的记录行数  
            int printingLine = 0;  
            while (printingLine < _pageRecordNumber)  
            {  
                x = _pageLeft;  
                //确定要当前要打印的记录的行号  
                _dataRow = _dataTable.Rows[_printRecordComplete];  
                for (int cols = 0; cols <= _dataTable.Columns.Count - 1; cols++)  
                {  
                    @event.Graphics.DrawString(_dataRow[cols].ToString().Trim(), TableFont, _drawBrush, x, stringY);  
                    x += _xUnit[cols];  
                }  
                stringY += _yUnit;  
                y += _yUnit;  
                @event.Graphics.DrawLine(pen, _pageLeft, y, x, y);  
  
                printingLine += 1;  
                _printRecordComplete += 1;  
                if (_printRecordComplete >= _dataTable.Rows.Count)  
                {  
                    @event.HasMorePages = false;  
                    _printRecordComplete = 0;  
                }  
            }  
  
            @event.Graphics.DrawLine(pen, _pageLeft, rowOfTop, _pageLeft, y);  
            x = _pageLeft;  
            for (int cols = 0; cols < _dataTable.Columns.Count; cols++)  
            {  
                x += _xUnit[cols];  
                @event.Graphics.DrawLine(pen, x, rowOfTop, x, y);  
            }  
  
  
            _printingPageNumber += 1;  
  
            if (_printingPageNumber > _totalPage)  
            {  
                @event.HasMorePages = false;  
                _printingPageNumber = 1;  
                _printRecordComplete = 0;  
            }  
            else  
            {  
                @event.HasMorePages = true;  
            }  
        }  
   

        
        #endregion

        private void button1_Click(object sender, EventArgs e)
        {
            PrintPriview(table, "Student");
        }

调用方法:

打印:new PrintHelper().Print(dataTable,title);

预览:new PrintHelper().PrintPriview(dataTable,title);

转载:http://blog.csdn.net/a497785609/article/details/71190960

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用PrintDocument类和PrintPreviewDialog类可以实现RichTextBox的打印预览。 以下是示例代码: 打印: ```csharp private void printToolStripMenuItem_Click(object sender, EventArgs e) { PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler(doc_PrintPage); PrintDialog dlg = new PrintDialog(); dlg.Document = doc; if (dlg.ShowDialog() == DialogResult.OK) { doc.Print(); } } private void doc_PrintPage(object sender, PrintPageEventArgs e) { Font font = richTextBox1.Font; Brush brush = new SolidBrush(richTextBox1.ForeColor); RectangleF rect = e.MarginBounds; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Center; e.Graphics.DrawString(richTextBox1.Text, font, brush, rect, sf); } ``` 预览: ```csharp private void printPreviewToolStripMenuItem_Click(object sender, EventArgs e) { PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler(doc_PrintPage); PrintPreviewDialog dlg = new PrintPreviewDialog(); dlg.Document = doc; dlg.ShowDialog(); } ``` 上述代码中,doc_PrintPage方法用于绘制RichTextBox的内容,包括字体、颜色、对齐方式等。在打印预览中,只需创建PrintDocument和PrintPreviewDialog对象,然后将打印页面绘制事件与doc_PrintPage方法关联即可。在打印中,使用PrintDialog显示打印对话框,并调用Print方法进行打印。在预览中,直接显示PrintPreviewDialog即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值