日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#打印类

發布時間:2025/7/14 C# 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#打印类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#打印類

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.Drawing;

namespace WinAppPrint
{
??? /// <summary>
??? /// 打印類
??? /// </summary>
??? public class Printer
??? {
??????? private DataGridView dataview;
??????? private PrintDocument printDoc;
??????? //打印有效區域的寬度
??????? int width;
??????? int height;
??????? int columns;
??????? double Rate;
??????? bool hasMorePage = false;
??????? int currRow = 0;
??????? int rowHeight = 20;
??????? //打印頁數
??????? int PageNumber;
??????? //當前打印頁的行數
??????? int pageSize = 20;
??????? //當前打印的頁碼
??????? int PageIndex;
??????? private int PageWidth; //打印紙的寬度
??????? private int PageHeight; //打印紙的高度
??????? private int LeftMargin; //有效打印區距離打印紙的左邊大小
??????? private int TopMargin;//有效打印區距離打印紙的上面大小
??????? private int RightMargin;//有效打印區距離打印紙的右邊大小
??????? private int BottomMargin;//有效打印區距離打印紙的下邊大小
??????? int rows;

??????? /// <summary>
??????? /// 構造函數
??????? /// </summary>
??????? /// <param name="dataview">要打印的DateGridView</param>
??????? /// <param name="printDoc">PrintDocument用于獲取打印機的設置</param>
??????? public Printer(DataGridView dataview, PrintDocument printDoc)
??????? {
??????????? this.dataview = dataview;
??????????? this.printDoc = printDoc;
??????????? PageIndex = 0;
??????????? //獲取打印數據的具體行數
??????????? this.rows = dataview.RowCount;
??????????? this.columns = dataview.ColumnCount;
??????????? //判斷打印設置是否是橫向打印
??????????? if (!printDoc.DefaultPageSettings.Landscape)
??????????? {
??????????????? PageWidth = printDoc.DefaultPageSettings.PaperSize.Width;
??????????????? PageHeight = printDoc.DefaultPageSettings.PaperSize.Height;
??????????? }
??????????? else
??????????? {
??????????????? PageHeight = printDoc.DefaultPageSettings.PaperSize.Width;
??????????????? PageWidth = printDoc.DefaultPageSettings.PaperSize.Height;
??????????? }
??????????? LeftMargin = printDoc.DefaultPageSettings.Margins.Left;
??????????? TopMargin = printDoc.DefaultPageSettings.Margins.Top;
??????????? RightMargin = printDoc.DefaultPageSettings.Margins.Right;
??????????? BottomMargin = printDoc.DefaultPageSettings.Margins.Bottom;
??????????? height = PageHeight - TopMargin - BottomMargin - 2;
??????????? width = PageWidth - LeftMargin - RightMargin - 2;
??????????? double tempheight = height;
??????????? double temprowHeight = rowHeight;
??????????? while (true)
??????????? {
??????????????? string temp = Convert.ToString(tempheight / Math.Round(temprowHeight, 3));
??????????????? int i = temp.IndexOf('.');
??????????????? double tt = 100;
??????????????? if (i != -1)
??????????????? {
??????????????????? tt = Math.Round(Convert.ToDouble(temp.Substring(temp.IndexOf('.'))), 3);
??????????????? }
??????????????? if (tt <= 0.01)
??????????????? {
??????????????????? rowHeight = Convert.ToInt32(temprowHeight);
??????????????????? break;
??????????????? }
??????????????? else
??????????????? {
??????????????????? temprowHeight = temprowHeight + 0.01;
??????????????? }
??????????? }
??????????? pageSize = height / rowHeight;
??????????? if ((rows + 1) <= pageSize)
??????????? {
??????????????? pageSize = rows + 1;
??????????????? PageNumber = 1;
??????????? }
??????????? else
??????????? {
??????????????? PageNumber = rows / (pageSize - 1);
??????????????? if (rows % (pageSize - 1) != 0)
??????????????? {
??????????????????? PageNumber = PageNumber + 1;
??????????????? }
??????????? }
??????? }

??????? /// <summary>
??????? /// 初始化打印
??????? /// </summary>
??????? private void InitPrint()
??????? {
??????????? PageIndex = PageIndex + 1;
??????????? if (PageIndex == PageNumber)
??????????? {
??????????????? hasMorePage = false;
??????????????? if (PageIndex != 1)
??????????????? {
??????????????????? pageSize = rows % (pageSize - 1) + 1;
??????????????? }
??????????? }
??????????? else
??????????? {
??????????????? hasMorePage = true;
??????????? }
??????? }

??????? //打印頭
??????? private void DrawHeader(Graphics g)
??????? {
??????????? Font font = new Font("宋體", 12, FontStyle.Bold);
??????????? int temptop = (rowHeight / 2) + TopMargin + 1;
??????????? int templeft = LeftMargin + 1;
??????????? for (int i = 0; i < this.columns; i++)
??????????? {
??????????????? string headString = this.dataview.Columns[i].HeaderText;
??????????????? float fontHeight = g.MeasureString(headString, font).Height;
??????????????? float fontwidth = g.MeasureString(headString, font).Width;
??????????????? float temp = temptop - (fontHeight) / 3;
??????????????? g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));
??????????????? templeft = templeft + (int)(this.dataview.Columns[i].Width / Rate) + 1;
??????????? }
??????? }

??????? //畫表格
??????? private void DrawTable(Graphics g)
??????? {
??????????? Rectangle border = new Rectangle(LeftMargin, TopMargin, width, (pageSize) * rowHeight);
??????????? g.DrawRectangle(new Pen(Brushes.Black, 2), border);
??????????? for (int i = 1; i < pageSize; i++)
??????????? {
??????????????? if (i != 1)
??????????????? {
??????????????????? g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));
??????????????? }
??????????????? else
??????????????? {
??????????????????? g.DrawLine(new Pen(Brushes.Black, 2), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));
??????????????? }
??????????? }

??????????? //計算出列的總寬度和打印紙比率
??????????? Rate = Convert.ToDouble(GetDateViewWidth()) / Convert.ToDouble(width);
??????????? int tempLeft = LeftMargin + 1;
??????????? int endY = (pageSize) * rowHeight + TopMargin;
??????????? for (int i = 1; i < columns; i++)
??????????? {
??????????????? tempLeft = tempLeft + 1 + (int)(this.dataview.Columns[i - 1].Width / Rate);
??????????????? g.DrawLine(new Pen(Brushes.Black, 1), new Point(tempLeft, TopMargin), new Point(tempLeft, endY));
??????????? }
??????? }

??????? /// <summary>
??????? /// 獲取打印的列的總寬度
??????? /// </summary>
??????? /// <returns></returns>
??????? private int GetDateViewWidth()
??????? {
??????????? int total = 0;
??????????? for (int i = 0; i < this.columns; i++)
??????????? {
??????????????? total = total + this.dataview.Columns[i].Width;
??????????? }
??????????? return total;
??????? }

??????? //打印行數據
??????? private void DrawRows(Graphics g)
??????? {
??????????? Font font = new Font("宋體", 12, FontStyle.Regular);
??????????? int temptop = (rowHeight / 2) + TopMargin + 1 + rowHeight;
??????????? for (int i = currRow; i < pageSize + currRow - 1; i++)
??????????? {
??????????????? int templeft = LeftMargin + 1;
??????????????? for (int j = 0; j < columns; j++)
??????????????? {
??????????????????? string headString = this.dataview.Rows[i].Cells[j].Value.ToString();
??????????????????? float fontHeight = g.MeasureString(headString, font).Height;
??????????????????? float fontwidth = g.MeasureString(headString, font).Width;
??????????????????? float temp = temptop - (fontHeight) / 3;
??????????????????? while (true)
??????????????????? {
??????????????????????? if (fontwidth <= (int)(this.dataview.Columns[j].Width / Rate))
??????????????????????? {
??????????????????????????? break;
??????????????????????? }
??????????????????????? else
??????????????????????? {
??????????????????????????? headString = headString.Substring(0, headString.Length - 1);
??????????????????????????? fontwidth = g.MeasureString(headString, font).Width;
??????????????????????? }
??????????????????? }
??????????????????? g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));
??????????????????? templeft = templeft + (int)(this.dataview.Columns[j].Width / Rate) + 1;
??????????????? }
??????????????? temptop = temptop + rowHeight;
??????????? }
??????????? currRow = pageSize + currRow - 1;
??????? }

??????? /// <summary>
??????? /// 在PrintDocument中的PrintPage方法中調用
??????? /// </summary>
??????? /// <param name="g">傳入PrintPage中PrintPageEventArgs中的Graphics</param>
??????? /// <returns>是否還有打印頁 有返回true,無則返回false</returns>
??????? public bool Print(Graphics g)
??????? {
??????????? InitPrint();
??????????? DrawTable(g);
??????????? DrawHeader(g);
??????????? DrawRows(g);
??????????? //打印頁碼
??????????? string pagestr = PageIndex + " / " + PageNumber;
??????????? Font font = new Font("宋體", 12, FontStyle.Regular);
??????????? g.DrawString(pagestr, font, Brushes.Black, new PointF((PageWidth / 2) - g.MeasureString(pagestr, font).Width, PageHeight - (BottomMargin / 2) - g.MeasureString(pagestr, font).Height));
??????????? //打印查詢的功能項名稱
??????????? string temp = dataview.Tag.ToString() + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm");
??????????? g.DrawString(temp, font, Brushes.Black, new PointF(PageWidth - 5 - g.MeasureString(temp, font).Width, PageHeight - 5 - g.MeasureString(temp, font).Height));
??????????? return hasMorePage;
??????? }
??? }
}

posted on 2016-01-24 10:26 江宇旋 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/jiangyuxuan/p/5154766.html

總結

以上是生活随笔為你收集整理的C#打印类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。