转载 Winform中打印dataGridView里的内容 c datagridview 打印

原文地址:Winform中打印dataGridView里的内容作者:望穿秋水

//调用GridPrinter

首先添加一个printDocument控件并激活其printDocument_PrintPage事件写:

实例化类GridPrinter gridPrinter;

private void printDocument_PrintPage(object sender,System.Drawing.Printing.PrintPageEventArgs e)
{
bool more = gridPrinter.DrawDataGridView(e.Graphics);
if (more == true)
e.HasMorePages = true;
}

//定义一个bool方法

private bool InitializePrinting()
{
PrintDialog printDialog = new PrintDialog();
//printDialog.AllowCurrentPage = true;
//printDialog.AllowPrintToFile = true;
//printDialog.AllowSelection = true;
//printDialog.AllowSomePages = true;
//printDialog.PrintToFile = true;
//printDialog.ShowHelp = true;
//printDialog.ShowNetwork = true;

if (printDialog.ShowDialog() != DialogResult.OK)
return false;

printDocument.DocumentName = "人员基本信息";
printDocument.PrinterSettings = printDialog.PrinterSettings;
printDocument.DefaultPageSettings=printDialog.PrinterSettings.DefaultPageSettings;
printDocument.DefaultPageSettings.Margins = new Margins(40, 40, 40,40);

gridPrinter = new GridPrinter(dataGridView1, printDocument, true,true, "人员基本信息", new Font("黑体", 18, FontStyle.Bold,GraphicsUnit.Point), Color.Blue, true);
return true;
}

//打印按钮中添加如下代码:

if (InitializePrinting())
{
PrintPreviewDialog printPreviewDialog = newPrintPreviewDialog();
printPreviewDialog.Document = printDocument;
printPreviewDialog.ShowDialog();
}

//运行效果如图所示:

点确定按钮后如图所示:

//公用打印类

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

public class GridPrinter
{
// the gridto print
privateDataGridView dataGridView;

// thePrintDocument
privatePrintDocument printDocument;

// centerprintout?
private boolcenterOnPage;

// has atitle?
private boolhasTitle;

//title
privatestring title;

//font
private FonttitleFont;

// titlecolor
privateColor titleColor;

// usepaging?
private boolpaging;

// rowprinting
static intcurrentRow;

// pageprinting
static intpageNumber;

// pagewidth
private intpageWidth;

// pageheight
private intpageHeight;

// leftmargin
private intleftMargin;

// topmargin
private inttopMargin;

// rightmargin
private intrightMargin;

// bottommargin
private intbottomMargin;

// ylocation placeholder
privatefloat currentY;

// gridsizes
privatefloat rowHeaderHeight;
privateList<float> rowsHeight;
privateList<float> columnsWidth;
privatefloat dataGridViewWidth;

// columnstop points
privateList<int[]> mColumnPoints;
privateList<float> mColumnPointsWidth;
private intmColumnPoint;

publicGridPrinter(DataGridView objDataGridView, PrintDocumentobjPrintDocument, bool bCenterOnPage, bool bHasTitle, stringsTitle, Font objTitleFont, Color objTitleColor, bool bPaging)
{
dataGridView = objDataGridView;
printDocument = objPrintDocument;
centerOnPage = bCenterOnPage;
hasTitle = bHasTitle;
title = sTitle;
titleFont = objTitleFont;
titleColor = objTitleColor;
paging = bPaging;

pageNumber = 0;

rowsHeight = new List<float>();
columnsWidth = new List<float>();

mColumnPoints = newList<int[]>();
mColumnPointsWidth = newList<float>();

if (!printDocument.DefaultPageSettings.Landscape)
{
pageWidth =printDocument.DefaultPageSettings.PaperSize.Width;
pageHeight =printDocument.DefaultPageSettings.PaperSize.Height;
}
else
{
pageHeight =printDocument.DefaultPageSettings.PaperSize.Width;
pageWidth =printDocument.DefaultPageSettings.PaperSize.Height;
}

leftMargin = printDocument.DefaultPageSettings.Margins.Left;
topMargin = printDocument.DefaultPageSettings.Margins.Top;
rightMargin =printDocument.DefaultPageSettings.Margins.Right;
bottomMargin =printDocument.DefaultPageSettings.Margins.Bottom;

currentRow = 0;
}

//calculate printing metrics
private voidCalculate(Graphics g)
{
if (pageNumber == 0)
{
SizeF tmpSize = new SizeF();
Font tmpFont;
float tmpWidth;

dataGridViewWidth = 0;
for (int i = 0; i < dataGridView.Columns.Count;i++)
{
tmpFont = dataGridView.ColumnHeadersDefaultCellStyle.Font;
if (tmpFont == null)
tmpFont = dataGridView.DefaultCellStyle.Font;

tmpSize = g.MeasureString(dataGridView.Columns[i].HeaderText,tmpFont);
tmpWidth = tmpSize.Width;
rowHeaderHeight = tmpSize.Height;

for (int j = 0; j < dataGridView.Rows.Count;j++)
{
tmpFont = dataGridView.Rows[j].DefaultCellStyle.Font;
if (tmpFont == null)
tmpFont = dataGridView.DefaultCellStyle.Font;

tmpSize = g.MeasureString("Anything", tmpFont);
rowsHeight.Add(tmpSize.Height);

tmpSize =g.MeasureString(dataGridView.Rows[j].Cells[i].EditedFormattedValue.ToString(),tmpFont);
if (tmpSize.Width > tmpWidth)
tmpWidth = tmpSize.Width;
}
if (dataGridView.Columns[i].Visible)
dataGridViewWidth += tmpWidth;
columnsWidth.Add(tmpWidth);
}

int k;

int mStartPoint = 0;
for (k = 0; k < dataGridView.Columns.Count;k++)
if (dataGridView.Columns[k].Visible)
{
mStartPoint = k;
break;
}

int mEndPoint = dataGridView.Columns.Count;
for (k = dataGridView.Columns.Count - 1; k >= 0;k--)
if (dataGridView.Columns[k].Visible)
{
mEndPoint = k + 1;
break;
}

float mTempWidth = dataGridViewWidth;
float mTempPrintArea = (float)pageWidth - (float)leftMargin -(float)rightMargin;

if (dataGridViewWidth > mTempPrintArea)
{
mTempWidth = 0.0F;
for (k = 0; k < dataGridView.Columns.Count;k++)
{
if (dataGridView.Columns[k].Visible)
{
mTempWidth += columnsWidth[k];
if (mTempWidth > mTempPrintArea)
{
mTempWidth -= columnsWidth[k];
mColumnPoints.Add(new int[] { mStartPoint, mEndPoint });
mColumnPointsWidth.Add(mTempWidth);
mStartPoint = k;
mTempWidth = columnsWidth[k];
}
}
mEndPoint = k + 1;
}
}

mColumnPoints.Add(new int[] { mStartPoint, mEndPoint });
mColumnPointsWidth.Add(mTempWidth);
mColumnPoint = 0;
}
}

// headerprinting
private voidDrawHeader(Graphics g)
{
currentY = (float)topMargin;

if (paging)
{
pageNumber++;
string PageString = "Page " + pageNumber.ToString();

StringFormat PageStringFormat = new StringFormat();
PageStringFormat.Trimming = StringTrimming.Word;
PageStringFormat.FormatFlags = StringFormatFlags.NoWrap |StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
PageStringFormat.Alignment = StringAlignment.Far;

Font PageStringFont = new Font("Arial", 8, FontStyle.Regular,GraphicsUnit.Point);

RectangleF PageStringRectangle = new RectangleF((float)leftMargin,currentY, (float)pageWidth - (float)rightMargin -(float)leftMargin, g.MeasureString(PageString,PageStringFont).Height);

g.DrawString(PageString, PageStringFont, newSolidBrush(Color.Black), PageStringRectangle,PageStringFormat);

currentY += g.MeasureString(PageString,PageStringFont).Height;
}

if (hasTitle)
{
StringFormat TitleFormat = new StringFormat();
TitleFormat.Trimming = StringTrimming.Word;
TitleFormat.FormatFlags = StringFormatFlags.NoWrap |StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
if (centerOnPage)
TitleFormat.Alignment = StringAlignment.Center;
else
TitleFormat.Alignment = StringAlignment.Near;

RectangleF TitleRectangle = new RectangleF((float)leftMargin,currentY, (float)pageWidth - (float)rightMargin -(float)leftMargin, g.MeasureString(title, titleFont).Height);

g.DrawString(title, titleFont, new SolidBrush(titleColor),TitleRectangle, TitleFormat);

currentY += g.MeasureString(title, titleFont).Height;
}

float CurrentX = (float)leftMargin;
if(centerOnPage)
CurrentX += (((float)pageWidth - (float)rightMargin -(float)leftMargin) - mColumnPointsWidth[mColumnPoint]) / 2.0F;

Color HeaderForeColor =dataGridView.ColumnHeadersDefaultCellStyle.ForeColor;
if (HeaderForeColor.IsEmpty)
HeaderForeColor = dataGridView.DefaultCellStyle.ForeColor;
SolidBrush HeaderForeBrush = new SolidBrush(HeaderForeColor);

Color HeaderBackColor =dataGridView.ColumnHeadersDefaultCellStyle.BackColor;
if (HeaderBackColor.IsEmpty)
HeaderBackColor = dataGridView.DefaultCellStyle.BackColor;
SolidBrush HeaderBackBrush = new SolidBrush(HeaderBackColor);

Pen TheLinePen = new Pen(dataGridView.GridColor, 1);

Font HeaderFont =dataGridView.ColumnHeadersDefaultCellStyle.Font;
if (HeaderFont == null)
HeaderFont = dataGridView.DefaultCellStyle.Font;

RectangleF HeaderBounds = new RectangleF(CurrentX, currentY,mColumnPointsWidth[mColumnPoint], rowHeaderHeight);
g.FillRectangle(HeaderBackBrush, HeaderBounds);

StringFormat CellFormat = new StringFormat();
CellFormat.Trimming = StringTrimming.Word;
CellFormat.FormatFlags = StringFormatFlags.NoWrap |StringFormatFlags.LineLimit | StringFormatFlags.NoClip;

RectangleF CellBounds;
floatColumnWidth;
for (int i = (int)mColumnPoints[mColumnPoint].GetValue(0); i< (int)mColumnPoints[mColumnPoint].GetValue(1);i++)
{
if (!dataGridView.Columns[i].Visible) continue;

ColumnWidth = columnsWidth[i];

if(dataGridView.ColumnHeadersDefaultCellStyle.Alignment.ToString().Contains("Right"))
CellFormat.Alignment = StringAlignment.Far;
else if(dataGridView.ColumnHeadersDefaultCellStyle.Alignment.ToString().Contains("Center"))
CellFormat.Alignment = StringAlignment.Center;
else
CellFormat.Alignment = StringAlignment.Near;

CellBounds = new RectangleF(CurrentX, currentY, ColumnWidth,rowHeaderHeight);

g.DrawString(dataGridView.Columns[i].HeaderText, HeaderFont,HeaderForeBrush, CellBounds, CellFormat);

if (dataGridView.RowHeadersBorderStyle !=DataGridViewHeaderBorderStyle.None)
g.DrawRectangle(TheLinePen, CurrentX, currentY, ColumnWidth,rowHeaderHeight);

CurrentX += ColumnWidth;
}

currentY += rowHeaderHeight;
}

// commonrow printing function
private boolDrawRows(Graphics g)
{
Pen TheLinePen = new Pen(dataGridView.GridColor,1);

Font RowFont;
Color RowForeColor;
Color RowBackColor;
SolidBrush RowForeBrush;
SolidBrush RowBackBrush;
SolidBrush RowAlternatingBackBrush;

StringFormat CellFormat = new StringFormat();
CellFormat.Trimming = StringTrimming.Word;
CellFormat.FormatFlags = StringFormatFlags.NoWrap |StringFormatFlags.LineLimit;

RectangleF RowBounds;
float CurrentX;
float ColumnWidth;
while (currentRow < dataGridView.Rows.Count)
{
if (dataGridView.Rows[currentRow].Visible)
{
RowFont =dataGridView.Rows[currentRow].DefaultCellStyle.Font;
if (RowFont == null)
RowFont = dataGridView.DefaultCellStyle.Font;

RowForeColor =dataGridView.Rows[currentRow].DefaultCellStyle.ForeColor;
if (RowForeColor.IsEmpty)
RowForeColor = dataGridView.DefaultCellStyle.ForeColor;
RowForeBrush = new SolidBrush(RowForeColor);

RowBackColor =dataGridView.Rows[currentRow].DefaultCellStyle.BackColor;
if (RowBackColor.IsEmpty)
{
RowBackBrush = newSolidBrush(dataGridView.DefaultCellStyle.BackColor);
RowAlternatingBackBrush = newSolidBrush(dataGridView.AlternatingRowsDefaultCellStyle.BackColor);
}
else
{
RowBackBrush = new SolidBrush(RowBackColor);
RowAlternatingBackBrush = new SolidBrush(RowBackColor);
}

CurrentX = (float)leftMargin;
if(centerOnPage)
CurrentX += (((float)pageWidth - (float)rightMargin -(float)leftMargin) - mColumnPointsWidth[mColumnPoint]) / 2.0F;

RowBounds = new RectangleF(CurrentX, currentY,mColumnPointsWidth[mColumnPoint], rowsHeight[currentRow]);

if (currentRow % 2 == 0)
g.FillRectangle(RowBackBrush, RowBounds);
else
g.FillRectangle(RowAlternatingBackBrush, RowBounds);

for (int CurrentCell =(int)mColumnPoints[mColumnPoint].GetValue(0); CurrentCell< (int)mColumnPoints[mColumnPoint].GetValue(1);CurrentCell++)
{
if (!dataGridView.Columns[CurrentCell].Visible) continue;

if(dataGridView.Columns[CurrentCell].DefaultCellStyle.Alignment.ToString().Contains("Right"))
CellFormat.Alignment = StringAlignment.Far;
else if(dataGridView.Columns[CurrentCell].DefaultCellStyle.Alignment.ToString().Contains("Center"))
CellFormat.Alignment = StringAlignment.Center;
else
CellFormat.Alignment = StringAlignment.Near;

ColumnWidth = columnsWidth[CurrentCell];
RectangleF CellBounds = new RectangleF(CurrentX, currentY,ColumnWidth, rowsHeight[currentRow]);

g.DrawString(dataGridView.Rows[currentRow].Cells[CurrentCell].EditedFormattedValue.ToString(),RowFont, RowForeBrush, CellBounds, CellFormat);

if (dataGridView.CellBorderStyle !=DataGridViewCellBorderStyle.None)
g.DrawRectangle(TheLinePen, CurrentX, currentY, ColumnWidth,rowsHeight[currentRow]);

CurrentX += ColumnWidth;
}
currentY += rowsHeight[currentRow];

if ((int)currentY > (pageHeight - topMargin -bottomMargin))
{
currentRow++;
return true;
}
}
currentRow++;
}

currentRow = 0;
mColumnPoint++;

if (mColumnPoint == mColumnPoints.Count)
{
mColumnPoint = 0;
return false;
}
else
return true;
}

// themain grid printing method
public boolDrawDataGridView(Graphics g)
{
try
{
Calculate(g);
DrawHeader(g);
bool bContinue = DrawRows(g);
return bContinue;
}
catch (Exception ex)
{
[转载]Winform中打印dataGridView里的内容 c datagridview 打印
MessageBox.Show("ERROR: " + ex.Message.ToString(),Application.ProductName, MessageBoxButtons.OK,MessageBoxIcon.Error);
return false;
}
}
}

  

爱华网本文地址 » http://www.aihuau.com/a/25101017/352247.html

更多阅读

怎样下载百度文库的内容 百度文库如何打印出来

怎样下载百度文库的内容——简介  互联网时代,给我们工作生活带来了很大的便捷,可以直接在网上下载资料帮助我们解决工作生活中遇到的问题。为了实现资源共享的管理理念,很多网站下载资源要求首先上传资源获得相应财富值才可以下载。

0080-口袋里的战争 0080口袋中的战争

0080-口袋里的战争这是一部在各大高达论坛的高达历代作品排名都绝对不会出3甲的经典作品。本作的主人公巴尼(不算阿鲁,单从机师来说)绝对是历代主人公中最平凡,名气最小的,他不像是NEW TYPE 的阿姆罗,卡缪,捷多,胡苏等人,不像是自暴狂小强希

声明:《转载 Winform中打印dataGridView里的内容 c datagridview 打印》为网友人生路分享!如侵犯到您的合法权益请联系我们删除