winform打印datatable

本文介绍如何使用C#在WinForm应用程序中实现打印预览功能,包括设置打印参数、加载数据到表格并进行布局打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinFormPrint

{
    public partial class FrmPrint : Form
    {
        private System.Drawing.Printing.PaperSize paperSize;
        /// <summary>
        /// 打印的标题
        /// </summary>
        public string strTitle { get; set; }
        /// <summary>
        /// 打印显示的内容
        /// </summary>
        public DataTable printDt = new DataTable();
        /// <summary>
        /// 表格宽度
        /// </summary>
        public int PRINT_GRID_WIDTH = 400;
        /// <summary>
        /// 表格左边界(或右)
        /// </summary>
        public int PRINT_GRID_LEFT = 150;
        /// <summary>
        /// 表格距页面顶端的距离
        /// </summary>
        public int TABLE_TOP_HEIGHT = 200;
        /// <summary>
        /// 打印内容距离表格顶端的距离
        /// </summary>
        private const int PRINT_TOP_HEIGHT = 20;
        /// <summary>
        /// 单元格高度
        /// </summary>
        private const int PRINT_CELL_HEIGHT = 50;
        /// <summary>
        /// 打印字体
        /// </summary>
        private Font printFont;
        /// <summary>
        /// 打印字体(表头)
        /// </summary>
        private Font printFontTitle;
        /// <summary>
        /// 打印画笔
        /// </summary>

        private SolidBrush printSolidBrush;

        public FrmPrint()
        {
            InitializeComponent();
        }
        private void FrmPrint_Load(object sender, EventArgs e)
        {
            try
            {
                this.printPreview.Document = this.printDoc;
                paperSize = printDoc.PrinterSettings.DefaultPageSettings.PaperSize;
                printFontTitle = new Font(this.Font.FontFamily, 16, FontStyle.Bold);
                printFont = new Font(this.Font.FontFamily, 16);

                printSolidBrush = new SolidBrush(Color.Black);

                this.strTitle = "标题测试";
                LoadData();

                //将标题加载至datatable的第一行中
                DataRow drTitle = printDt.NewRow();
                drTitle[0] = strTitle;
                printDt.Rows.InsertAt(drTitle, 0);
            }
            catch (Exception ex) 
            {
                MessageBox.Show(this, "加载窗体时出错,详细信息:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void LoadData() 
        {
            printDt.Columns.Add("c1");
            printDt.Columns.Add("c2");
            printDt.Columns.Add("c3");
            printDt.Columns.Add("c4");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = printDt.NewRow();
                dr["c1"] = "c1"+i.ToString();
                dr["c2"] = "c2" + i.ToString();
                dr["c3"] = "c3" + i.ToString();
                dr["c4"] = "c4" + i.ToString();
                printDt.Rows.Add(dr);
            }
        }

        private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            try
            {
                if (this.DesignMode) return;
                if (printDt.Rows.Count <= 1) 
                {
                    MessageBox.Show(this, "没有要打印的内容。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                SizeF fontSize = e.Graphics.MeasureString(this.strTitle, printFont);
                float printMiddle = (paperSize.Width - fontSize.Width) / 2.0f;//页面中心
                Pen p = new Pen(Color.Black, 1);

                //根据printDt的行数,算出每一行上单元格的宽度
                float oneCellWidth = (paperSize.Width - (printMiddle - PRINT_GRID_LEFT) * 2) / printDt.Columns.Count;

                for (int i = 1; i <= printDt.Rows.Count; i++) 
                {
                    float y =this.TABLE_TOP_HEIGHT+(i-1) * PRINT_CELL_HEIGHT;//y轴坐标
                    e.Graphics.DrawRectangle(p, printMiddle - PRINT_GRID_LEFT, y, PRINT_GRID_WIDTH, PRINT_CELL_HEIGHT);
                        
                    if (i != 1)
                    {          
                        bool lastNull=false;//上一列是否为空
                        int startDrawIndex=0;//当前列不为空时,要打印数据的位置
                        //画出每一行中每一单元格的竖线
                        for (int j = 1; j <= printDt.Columns.Count; j++)
                        {
                            if (printDt.Rows[i - 1][j - 1] != DBNull.Value)
                            {
                                if(j<printDt.Columns.Count)//此处画出竖线,因之前画过一矩形,此处不再画最后一条竖线
                                    e.Graphics.DrawLine(p, printMiddle - PRINT_GRID_LEFT + j * oneCellWidth, y, printMiddle - PRINT_GRID_LEFT + j * oneCellWidth, y + PRINT_CELL_HEIGHT);//画出单元格

                                if (!lastNull)
                                {
                                    startDrawIndex = j;
                                }
                                e.Graphics.DrawString(string.Format("{0}", printDt.Rows[i - 1][j - 1].ToString()), printFont, printSolidBrush, printMiddle - PRINT_GRID_LEFT + (startDrawIndex - 1) * oneCellWidth, y + PRINT_TOP_HEIGHT);
                                lastNull = false;//打印过值后,此时对于下一列来说,他的上一列已不为空,所以置该标示
                            }
                            else
                            {
                                //说明该列之前那一列不为空
                                if (!lastNull)
                                {
                                    startDrawIndex = j;
                                    lastNull = true;
                                }
                            }
                        }
                    }
                    else
                    {
                        //打印标题
                        e.Graphics.DrawString(string.Format("{0}", this.printDt.Rows[0][0].ToString()), printFontTitle, printSolidBrush, printMiddle, y + PRINT_TOP_HEIGHT);
                    }
                }
            }
            catch (Exception ex) 
            {
                MessageBox.Show("打印预览过程中出错,详细:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tBtnPrint_Click(object sender, EventArgs e)
        {
            printDoc.Print();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值