winform DataGridView控件的打印

摘要:
借用网上的代码,应该是完整的打印过程了。

借用网上的代码,应该是完整的打印过程了。有打印,预览,设置三个按钮

代码:

public partial class Example : Form

{

//打印文檔

PrintDocument pdDocument = new PrintDocument();

//打印格式設置頁面

PageSetupDialog dlgPageSetup = new PageSetupDialog();

//打印頁面

PrintDialog dlgPrint = new PrintDialog();

//實例化打印預覽

PrintPreviewDialog dlgPrintPreview = new PrintPreviewDialog();

public Example()

{

InitializeComponent();

pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);

//頁面設置的打印文檔設置為需要打印的文檔

dlgPageSetup.Document = pdDocument;

//打印界面的打印文檔設置為被打印文檔

dlgPrint.Document = pdDocument;

//打印預覽的打印文檔設置為被打印文檔

dlgPrintPreview.Document = pdDocument;

}

/// <summary>

/// //顯示打印預覽界面 ,此处需要添加一个打印预览的按钮

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnPrintView_Click(object sender, EventArgs e)

{

dlgPrintPreview.ShowDialog();

}

/// <summary>

/// 打印设置,此处需要添加一个打印设置的按钮

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnPrintSetup_Click(object sender, EventArgs e)

{

dlgPageSetup.ShowDialog();

dlgPrint.ShowDialog();

}

///

/// printDocument的PrintPage事件 ,实现打印功能

///

///

///

private void OnPrintPage(object sender, PrintPageEventArgs e)

{

int iX = 60;

int iY = 40;

PrintDataGridView11.Print(dataGridView1, true, e, ref iX, ref iY);

}

/// <summary>

/// 打印,此处需添加一个打印按钮

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnPrint_Click(object sender, EventArgs e)

{

pdDocument.Print();

}

}

/// <summary>

/// 实现DataGridView的打印 类

/// </summary>

public class PrintDataGridView11

{

private static List<DataGridViewCellPrint> CellPrintList = new List<DataGridViewCellPrint>();

/// <summary>

/// 打印的行数

/// </summary>

private static int printRowCount = 0;

/// <summary>

/// 是否要打印

/// </summary>

private static bool IsPrint = true;

/// <summary>

/// 设置的起始位置是否大于默认打印的边框

/// </summary>

private static bool IsRole = true;

/// <summary>

/// X坐标

/// </summary>

private static int PoXTmp = 0;

/// <summary>

/// Y坐标

/// </summary>

private static int PoYTmp = 0;

/// <summary>

/// 列间距

/// </summary>

private static int WidthTmp = 0;

/// <summary>

/// 行间距

/// </summary>

private static int HeightTmp = 0;

/// <summary>

/// 列数

/// </summary>

private static int RowIndex = 0;

///

/// 打印DataGridView控件

///

/// DataGridView控件

/// 是否包括列标题

/// 为 System.Drawing.Printing.PrintDocument.PrintPage 事件提供数据。

/// 起始X坐标

/// 起始Y坐标

///

public static void Print(DataGridView dataGridView, bool includeColumnText, PrintPageEventArgs eValue, ref int PoX, ref int PoY)

{

try

{

if (PrintDataGridView11.IsPrint)

{

PrintDataGridView11.printRowCount = 0;

PrintDataGridView11.IsPrint = false;

PrintDataGridView11.DataGridViewCellVsList(dataGridView, includeColumnText); //获取要打印的数据

if (0 == PrintDataGridView11.CellPrintList.Count)

return;

if (PoX > eValue.MarginBounds.Left) //如果设置的起始位置大于默认打印的边框,IsRole为true

PrintDataGridView11.IsRole = true;

else

PrintDataGridView11.IsRole = false;

PrintDataGridView11.PoXTmp = PoX;

PrintDataGridView11.PoYTmp = PoY;

PrintDataGridView11.RowIndex = 0;

WidthTmp = 0;

HeightTmp = 0;

}

if (0 != PrintDataGridView11.printRowCount)//换页后确定打印的初始位置

{

if (IsRole) //如果设置的起始位置大于默认打印的边框,起始位置为默认打印边框

{

PoX = PoXTmp = eValue.MarginBounds.Left;

PoY = PoYTmp = eValue.MarginBounds.Top;

}

else

{

PoX = PoXTmp;

PoY = PoYTmp;

}

}

while (PrintDataGridView11.printRowCount < PrintDataGridView11.CellPrintList.Count)

{

DataGridViewCellPrint CellPrint = CellPrintList[PrintDataGridView11.printRowCount];

if (RowIndex == CellPrint.RowIndex)//一行一行打印,CellPrint.RowIndex为datagridview1的行号

PoX = PoX + WidthTmp; //如果数据在一行,x坐标右移

else //换行后Y坐标下移,X坐标回到初始位置

{

PoX = PoXTmp;

PoY = PoY + HeightTmp;

if (PoY + HeightTmp > eValue.MarginBounds.Bottom)//分页

{

HeightTmp = 0;

eValue.HasMorePages = true;

return; //重新触发OnPrintPage事件

}

}

using (SolidBrush solidBrush = new SolidBrush(CellPrint.BackColor))

{

RectangleF rectF1 = new RectangleF(PoX, PoY, CellPrint.Width, CellPrint.Height);

eValue.Graphics.FillRectangle(solidBrush, rectF1);

using (Pen pen = new Pen(Color.Black, 1))

eValue.Graphics.DrawRectangle(pen, System.Drawing.Rectangle.Round(rectF1));//画出单个数据的方框格子

solidBrush.Color = CellPrint.ForeColor;

eValue.Graphics.DrawString(CellPrint.FormattedValue, CellPrint.Font, solidBrush, new System.Drawing.Point(PoX + 2, PoY + 3));//在方框中画出数据

}

WidthTmp = CellPrint.Width;

HeightTmp = CellPrint.Height;

RowIndex = CellPrint.RowIndex;

PrintDataGridView11.printRowCount++;

}

PoY = PoY + HeightTmp; //全部打印完后不再分页

eValue.HasMorePages = false;

PrintDataGridView11.IsPrint = true;

}

catch

{

eValue.HasMorePages = false;

PrintDataGridView11.IsPrint = true;

throw;//抛出异常

}

}

///

/// 将DataGridView控件内容转变到 CellPrintList

///

/// DataGridView控件

/// 是否包括列标题

///

private static void DataGridViewCellVsList(DataGridView dataGridView, bool includeColumnText)

{

CellPrintList.Clear();

try

{

int rowsCount = dataGridView.Rows.Count;

int colsCount = dataGridView.Columns.Count;

//最后一行是供输入的行时,不用读数据。

if (dataGridView.Rows[rowsCount - 1].IsNewRow)

rowsCount--;

//包括列标题

if (includeColumnText)

{

for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)

{

if (dataGridView.Columns[columnsIndex].Visible)

{

DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();

CellPrint.FormattedValue = dataGridView.Columns[columnsIndex].HeaderText;

CellPrint.RowIndex = 0;

CellPrint.ColumnIndex = columnsIndex;

CellPrint.Font = dataGridView.Columns[columnsIndex].HeaderCell.Style.Font;

CellPrint.BackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor;

CellPrint.ForeColor = dataGridView.ColumnHeadersDefaultCellStyle.ForeColor;

CellPrint.Width = dataGridView.Columns[columnsIndex].Width;

CellPrint.Height = dataGridView.ColumnHeadersHeight;

CellPrintList.Add(CellPrint); //add:每次添加一个数据

}

}

}

//读取单元格数据

for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)

{

for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)

{

if (dataGridView.Columns[columnsIndex].Visible)

{

DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();

CellPrint.FormattedValue = dataGridView.Rows[rowIndex].Cells[columnsIndex].FormattedValue.ToString();

if (includeColumnText)

CellPrint.RowIndex = rowIndex + 1;//假如包括列标题则从行号1开始

else

CellPrint.RowIndex = rowIndex;

CellPrint.ColumnIndex = columnsIndex;

CellPrint.Font = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.Font;

System.Drawing.Color TmpColor = System.Drawing.Color.Empty;

if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor)

TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor;

else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor)

TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor;

else

TmpColor = dataGridView.DefaultCellStyle.BackColor;

CellPrint.BackColor = TmpColor;

TmpColor = System.Drawing.Color.Empty;

if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor)

TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor;

else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor)

TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor;

else

TmpColor = dataGridView.DefaultCellStyle.ForeColor;

CellPrint.ForeColor = TmpColor;

CellPrint.Width = dataGridView.Columns[columnsIndex].Width;

CellPrint.Height = dataGridView.Rows[rowIndex].Height;

CellPrintList.Add(CellPrint);

}

}

}

}

catch { throw; }

}

private class DataGridViewCellPrint

{

/// <summary>

/// 格式化的单元格的值

/// </summary>

private string _FormattedValue = "";

private int _RowIndex = -1;

private int _ColumnIndex = -1;

private System.Drawing.Color _ForeColor = System.Drawing.Color.Black;

private System.Drawing.Color _BackColor = System.Drawing.Color.White;

private int _Width = 100;

private int _Height = 23;

private System.Drawing.Font _Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((byte)(134)));

/// <summary>

/// 获取或设置单元格的字体。

///<summary>

public System.Drawing.Font Font

{

set { if (null != value) _Font = value; }

get { return _Font; }

}

/// <summary>

/// 获取为显示进行格式化的单元格的值。

/// <summary>

public string FormattedValue

{

set { _FormattedValue = value; }

get { return _FormattedValue; }

}

/// <summary>

/// 获取或设置列的当前宽度(以像素为单位)。默认值为 100。

/// <summary>

public int Width

{

set { _Width = value; }

get { return _Width; }

}

/// <summary>

/// 获取或设置列标题行的高度(以像素为单位)。默认值为 23。

/// <summary>

public int Height

{

set { _Height = value; }

get { return _Height; }

}

/// <summary>

/// 获取或设置行号。

/// <summary>

public int RowIndex

{

set { _RowIndex = value; }

get { return _RowIndex; }

}

/// <summary>

/// 获取或设置列号。

/// <summary>

public int ColumnIndex

{

set { _ColumnIndex = value; }

get { return _ColumnIndex; }

}

/// <summary>

/// 获取或设置前景色。

/// <summary>

public System.Drawing.Color ForeColor

{

set { _ForeColor = value; }

get { return _ForeColor; }

}

/// <summary>

/// 获取或设置背景色。

/// <summary>

public System.Drawing.Color BackColor

{

set { _BackColor = value; } //只写

get { return _BackColor; } //只读

}

}

}

免责声明:文章转载自《winform DataGridView控件的打印》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Arduino】使用C#实现Arduino与电脑进行串行通讯Lua 公历转农历算法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[导入]C#实现WinForm窗口最小化到系统托盘

C#编写最小化时隐藏为任务栏图标的 Window appllication.   1.设置WinForm窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标。 3.添加窗体最小化事件(首先需要添加事件引用): this.SizeChanged...

WinForm获取窗体关闭原因和是否取消关闭值

窗体关闭的原因有很多种,如用户关闭,关机,上层窗体关闭等。 窗体是否取消关闭的值为True时,窗体将不关闭。 而窗体关闭原因有什么用途呢?可以作为判断是否弹出“确认关闭窗体对话框”的条件,例如当关闭原因是用户关闭时弹出,而关闭原因是关机时不弹出。 以下代码将以对话框显示以上信息。 private void Form1_FormClosing(object...

WinForm窗体程序中使用CefSharp获取加载后的资源、截取request参数、拦截response数据、注入jquery文件和js代码(4)-注入jquery文件和js代码

源码地址:源代码csdn  或者底部qq问我要 六、注入jquery文件和js代码 在界面button按钮点击事件中 private void button1_Click(object sender, EventArgs e) { //注入本机binx86debug下的文件 browser.E...

【转载】Visual Studio2017如何打包发布Winform窗体程序

在用C#语言编写好Winform窗体程序后,最后一步的操作是将设计好的Winform程序代码进行打包以及发布成安装包。在Visual Studio2017开发工具中,打包发布WinForm程序是比较简单的,只需要简单的几部操作即可完成打包发布操作,此文简要介绍Visual Studio2017打包发布WinForm程序的流程。 (1)首先选中需要打包发布的...

WinForm控件之【ToolTip】

  基本介绍 信息提示控件,用户将指针移过关联控件时显示信息,页面新增该控件后其他所有面板可视控件都会新增toolTip的关联文本内容属性。 常设置属性 AutoPopDelay:当指针在工具区域内保持静止时,工具提示窗口保持可见的时间长度; InitialDelay:指针在工具区域内保持静止时,多长时间触发提示窗口显示(毫秒单位); IsBalloon:...

winform窗体(六)——DataGridView控件及通过此控件中实现增删改查

DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一、后台数据绑定:    List<xxx> list = new List<xxx>();      dataGridView1.DataSource = list;      //设置不自动生成列,此属性在属性面板中没有      data...