c# winform 绘制表格填充数据并且打印预览表格

15 篇文章 0 订阅

 

调用打印类并执行预览

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 WinHis
{
    public partial class TempleTable : Form
    {
        public TempleTable()
        {
            InitializeComponent();
        }
        private int currentPageIndex = 0;
        private int rowCount = 0;
        private int pageCount = 0;
        private void TempleTable_Load(object sender, EventArgs e)
        {
            PrintPreviewDialog ppvw = new PrintPreviewDialog();
            ppvw.PrintPreviewControl.Zoom = 1.0; //显示比例为100%

            DataTable dt = new DataTable();
            dt.Columns.Add("id");
            dt.Columns.Add("name");
            dt.Columns.Add("date");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["id"] = i.ToString();
                dr["name"] = "设置要打印的文档设置要打印的文档";
                dr["date"] = "2023-12-21";
                dt.Rows.Add(dr);

            }
            dt.Dispose();
            ToPrint bll = new ToPrint();

            System.Drawing.Printing.PrintDocument printDoc = bll.CreatePrintDocument(dt, "dd");



            //System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument();
            PrintDialog MyDlg = new PrintDialog();
            MyDlg.Document = printDoc;
            printDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", 850, 1000);
            printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(60, 60, 60, 60); //设置边距             
            ppvw.Document = printDoc;   //设置要打印的文档 
            ((Form)ppvw).WindowState = FormWindowState.Maximized; //最大化  
            printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDoc_PrintPage); //打印事件 
            //printDoc.EndPrint += new System.Drawing.Printing.PrintEventHandler(printDoc_EndPrint);
            //ppvw.Document.DefaultPageSettings.Landscape = true;    // 设置打印为横向               
            ppvw.ShowDialog(); //打开预览
        }
        private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Font titleFont = new Font("宋体", 11, System.Drawing.FontStyle.Regular);//标题字体
            System.Drawing.Brush brush = new SolidBrush(System.Drawing.Color.Black);//画刷   
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 1);

            pageCount = 3;     //定义页数
            if (currentPageIndex == 0)   //当为第一页时
            {
               // ShowSecond(e, titleFont, brush, pen);
                ShowFirst(e, titleFont, brush, pen);
            }
            else if (currentPageIndex == 1)   //当为第二页时
            {
               // ShowFirst(e, titleFont, brush, pen);
            }
            else if (currentPageIndex == 2)   //当为第一页时
            {
               // ShowFirst(e, titleFont, brush, pen);
            }
            #region 分页控件
            currentPageIndex++;      //加新页
            if (currentPageIndex < pageCount)
            {
                e.HasMorePages = true;  //如果小于定义页 那么增加新的页数
            }
            else
            {
                e.HasMorePages = false; //停止增加新的页数
                currentPageIndex = 0;
            }
            #endregion
        }
        #region 首页内容
        private void ShowFirst(System.Drawing.Printing.PrintPageEventArgs e, Font titleFont3, System.Drawing.Brush brush, System.Drawing.Pen pen)
        {

            

        }
        #endregion

    }
}

绘制表格类:

using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Data;
using System;

namespace WinHis
{
    /// <summary>
    /// 打印,打印预览
    /// </summary>
    public class ToPrint
    {

        //以下用户可自定义
        //当前要打印文本的字体及字号
        private static Font TableFont = new Font("Verdana", 10, FontStyle.Regular);
        //表头字体
        private Font HeadFont = new Font("Verdana", 20, FontStyle.Bold);
        //表头文字
        private string HeadText = string.Empty;
        //表头高度
        private int HeadHeight = 40;
        //表的基本单位
        private int[] XUnit;
        private int YUnit = TableFont.Height * 2;
        //以下为模块内部使用
        private PrintDocument DataTablePrinter;
        private DataRow DataGridRow;
        private DataTable DataTablePrint;
        //当前要所要打印的记录行数,由计算得到
        private int PageRecordNumber;
        //正要打印的页号
        private int PrintingPageNumber = 1;
        //已经打印完的记录数
        private int PrintRecordComplete;
        private int PLeft;
        private int PTop;
        private int PRight;
        private int PBottom;
        private int PWidth;
        private int PHeigh;
        //当前画笔颜色
        private SolidBrush DrawBrush = new SolidBrush(Color.Black);
        //每页打印的记录条数
        private int PrintRecordNumber;
        //第一页打印的记录条数
        private int FirstPrintRecordNumber;
        //总共应该打印的页数
        private int TotalPage;
        //与列名无关的统计数据行的类目数(如,总计,小计......)
        public int TotalNum = 0;

        /// <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
            {
                PrintPreviewDialog PrintPriview = new PrintPreviewDialog();
                PrintPriview.Document = CreatePrintDocument(dt, Title);
                PrintPriview.WindowState = FormWindowState.Maximized;
                PrintPriview.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show("打印错误,请检查打印设置!");

            }
        }

        /// <summary>
        /// 创建打印文件
        /// </summary>
        public PrintDocument CreatePrintDocument(DataTable dt, string Title)
        {

            DataTablePrint = dt;
            HeadText = Title;
            DataTablePrinter = new PrintDocument();

            PageSetupDialog PageSetup = new PageSetupDialog();
            PageSetup.Document = DataTablePrinter;
            DataTablePrinter.DefaultPageSettings = PageSetup.PageSettings;
            DataTablePrinter.DefaultPageSettings.Landscape = true;//设置打印横向还是纵向
            //PLeft = 30; //DataTablePrinter.DefaultPageSettings.Margins.Left;
            PTop = DataTablePrinter.DefaultPageSettings.Margins.Top;
            //PRight = DataTablePrinter.DefaultPageSettings.Margins.Right;
            PBottom = DataTablePrinter.DefaultPageSettings.Margins.Bottom;
            PWidth = DataTablePrinter.DefaultPageSettings.Bounds.Width;
            PHeigh = DataTablePrinter.DefaultPageSettings.Bounds.Height;
            XUnit = new int[DataTablePrint.Columns.Count];
            PrintRecordNumber = Convert.ToInt32((PHeigh - PTop - PBottom - YUnit) / YUnit);
            FirstPrintRecordNumber = Convert.ToInt32((PHeigh - PTop - PBottom - HeadHeight - YUnit) / YUnit);

            if (DataTablePrint.Rows.Count > PrintRecordNumber)
            {
                if ((DataTablePrint.Rows.Count - FirstPrintRecordNumber) % PrintRecordNumber == 0)
                {
                    TotalPage = (DataTablePrint.Rows.Count - FirstPrintRecordNumber) / PrintRecordNumber + 1;
                }
                else
                {
                    TotalPage = (DataTablePrint.Rows.Count - FirstPrintRecordNumber) / PrintRecordNumber + 2;
                }
            }
            else
            {
                TotalPage = 1;
            }

            DataTablePrinter.PrintPage += new PrintPageEventHandler(DataTablePrinter_PrintPage);
            DataTablePrinter.DocumentName = HeadText;

            return DataTablePrinter;
        }

        /// <summary>
        /// 打印当前页
        /// </summary>
        private void DataTablePrinter_PrintPage(object sende, PrintPageEventArgs Ev)
        {


            int tableWith = 0;
            string ColumnText;

            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

            //打印表格线格式
            Pen Pen = new Pen(Brushes.Black, 1);

            #region 设置列宽

            foreach (DataRow dr in DataTablePrint.Rows)
            {
                for (int i = 0; i < DataTablePrint.Columns.Count; i++)
                {
                    int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(dr[i].ToString().Trim(), TableFont).Width);
                    if (colwidth > XUnit[i])
                    {
                        XUnit[i] = colwidth;
                    }
                }
            }

            if (PrintingPageNumber == 1)
            {
                for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
                {
                    ColumnText = DataTablePrint.Columns[Cols].ColumnName.ToString().Trim();
                    int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(ColumnText, TableFont).Width);
                    if (colwidth > XUnit[Cols])
                    {
                        XUnit[Cols] = colwidth;
                    }
                }
            }
            for (int i = 0; i < XUnit.Length; i++)
            {
                tableWith += XUnit[i];
            }
            #endregion

            PLeft = (Ev.PageBounds.Width - tableWith) / 2;
            int x = PLeft;
            int y = PTop;
            int stringY = PTop + (YUnit - TableFont.Height) / 2;
            int rowOfTop = PTop;

            //第一页
            if (PrintingPageNumber == 1)
            {
                //打印表头
                Ev.Graphics.DrawString(HeadText, HeadFont, DrawBrush, new Point(Ev.PageBounds.Width / 2, PTop), sf);


                //设置为第一页时行数
                PageRecordNumber = FirstPrintRecordNumber;
                rowOfTop = y = PTop + HeadFont.Height + 10;
                stringY = PTop + HeadFont.Height + 10 + (YUnit - TableFont.Height) / 2;
            }
            else
            {
                //计算,余下的记录条数是否还可以在一页打印,不满一页时为假
                if (DataTablePrint.Rows.Count - PrintRecordComplete >= PrintRecordNumber)
                {
                    PageRecordNumber = PrintRecordNumber;
                }
                else
                {
                    PageRecordNumber = DataTablePrint.Rows.Count - PrintRecordComplete;
                }
            }

            #region 列名
            if (PrintingPageNumber == 1 || PageRecordNumber > TotalNum)//最后一页只打印统计行时不打印列名
            {
                //得到datatable的所有列名
                for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
                {
                    ColumnText = DataTablePrint.Columns[Cols].ColumnName.ToString().Trim();

                    int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(ColumnText, TableFont).Width);
                    Ev.Graphics.DrawString(ColumnText, TableFont, DrawBrush, x, stringY);
                    x += XUnit[Cols];
                }
            }
            #endregion



            Ev.Graphics.DrawLine(Pen, PLeft, rowOfTop, x, rowOfTop);
            stringY += YUnit;
            y += YUnit;
            Ev.Graphics.DrawLine(Pen, PLeft, y, x, y);

            //当前页面已经打印的记录行数
            int PrintingLine = 0;
            while (PrintingLine < PageRecordNumber)
            {
                x = PLeft;
                //确定要当前要打印的记录的行号
                DataGridRow = DataTablePrint.Rows[PrintRecordComplete];
                for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
                {
                    Ev.Graphics.DrawString(DataGridRow[Cols].ToString().Trim(), TableFont, DrawBrush, x, stringY);
                    x += XUnit[Cols];
                }
                stringY += YUnit;
                y += YUnit;
                Ev.Graphics.DrawLine(Pen, PLeft, y, x, y);

                PrintingLine += 1;
                PrintRecordComplete += 1;
                if (PrintRecordComplete >= DataTablePrint.Rows.Count)
                {
                    Ev.HasMorePages = false;
                    PrintRecordComplete = 0;
                }
            }

            Ev.Graphics.DrawLine(Pen, PLeft, rowOfTop, PLeft, y);
            x = PLeft;
            for (int Cols = 0; Cols < DataTablePrint.Columns.Count; Cols++)
            {
                x += XUnit[Cols];
                Ev.Graphics.DrawLine(Pen, x, rowOfTop, x, y);
            }



            PrintingPageNumber += 1;

            if (PrintingPageNumber > TotalPage)
            {
                Ev.HasMorePages = false;
                PrintingPageNumber = 1;
                PrintRecordComplete = 0;
            }
            else
            {
                Ev.HasMorePages = true;
            }


        }

    }
}

 

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在C# WinForm窗体,如果你想要在表格控件上填充颜色,但是鼠标经过其他控件时整个表格里的数据都变了,可能是因为你在窗体上直接绘制表格,而没有使用自定义控件来解决这个问题。\[1\] 你可以尝试使用自适应类来解决这个问题。首先,将自适应类的代码复制到你的工程命名空间,然后声明自适应类的实例。接下来,在窗体上添加SizeChanged事件,并在事件方法记录窗体和控件的初始位置和大小。最后,调用自适应类的自适应方法,完成自适应。这样,你就可以在表格控件上填充颜色而不会受到其他控件的影响了。\[2\] 你还可以使用Panel、DataGridView等控件来实现自适应。\[2\] 在窗体的代码,你需要引入System、System.Collections.Generic、System.ComponentModel、System.Drawing和System.Windows.Forms这些命名空间,并在窗体的Load事件调用自适应类的初始化方法,记录窗体和控件的初始位置和大小。然后,在窗体的SizeChanged事件调用自适应类的自适应方法,完成自适应。\[3\] 这样,你就可以在C# WinForm窗体使用表格控件,并且实现自适应的效果了。 #### 引用[.reference_title] - *1* [C#自定义控件实现窗体绘制表格](https://blog.csdn.net/qq_22955427/article/details/76252582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C# WinForm 窗体及其控件的自适应](https://blog.csdn.net/chbxgbin/article/details/109690260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值