DataGridView打印(用到外国人写的打印类)

以前的一段时间,看到好多的网友在搜索WinForm程序中DataGridView控件怎样打印的问题,虽然也有很多的朋友都给提供了相当好的解决方法,但可能是因为本身的基础知识不是牢固或者是网友提供的解决方法呢都仅仅是给提供了这个打印类并没有讲到具体的怎样在程序中去应用操作的整个流程,因此本文章将会仔细的讲解具体的在程序中怎样用到这个打印类(这个打印类是外国人写的,虽然中国也有好的打印方法或是相关的自定义的打印控件及参考资料,但我是用这个打印类测试的程序所以就讲这个打印类)。

为了好讲解呢先把效果图给贴下:

点击打印按钮的时候会弹出一个预览打印数据的界面,选择打印后就可以打印了。

下面具体来讲解这样操作,在窗体上拖放一个Button按钮,一个DataGirdView控件,一个printDocument1控件

在printDocument控件的PrintPage事件中添加一下代码:

View Code
GridPrinter gridPrinter;//声明打印类
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
bool more = gridPrinter.DrawDataGridView(e.Graphics);
if (more == true)
e.HasMorePages
= true;

}

下面就来看看打印类是怎样的:

View Code
/// <summary>
/// DataGridView打印类
/// </summary>
public class GridPrinter
{
// the grid to print
private DataGridView dataGridView;

// the PrintDocument
private PrintDocument printDocument;

// center printout?
private bool centerOnPage;

// has a title?
private bool hasTitle;

// title
private string title;

// font
private Font titleFont;

// title color
private Color titleColor;

// use paging?
private bool paging;

// row printing
static int currentRow;

// page printing
static int pageNumber;

// page width
private int pageWidth;

// page height
private int pageHeight;

// left margin
private int leftMargin;

// top margin
private int topMargin;

// right margin
private int rightMargin;

// bottom margin
private int bottomMargin;

// y location placeholder
private float currentY;

// grid sizes
private float rowHeaderHeight;
private List<float> rowsHeight;
private List<float> columnsWidth;
private float dataGridViewWidth;

// column stop points
private List<int[]> mColumnPoints;
private List<float> mColumnPointsWidth;
private int mColumnPoint;

public GridPrinter(DataGridView objDataGridView, PrintDocument objPrintDocument, bool bCenterOnPage, bool bHasTitle, string sTitle, 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
= new List<int[]>();
mColumnPointsWidth
= new List<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 void Calculate(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;
}
}

// header printing
private void DrawHeader(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,
new SolidBrush(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;
float ColumnWidth;
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;
}

// common row printing function
private bool DrawRows(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
= new SolidBrush(dataGridView.DefaultCellStyle.BackColor);
RowAlternatingBackBrush
= new SolidBrush(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;
}


// the main grid printing method
public bool DrawDataGridView(Graphics g)
{
try
{
Calculate(g);
DrawHeader(g);
bool bContinue = DrawRows(g);
return bContinue;
}
catch (Exception ex)
{
MessageBox.Show(
"ERROR: " + ex.Message.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}




}

现在看看点击打印按钮事件:

//打印事件
private void btnPrint_Click(object sender, EventArgs e)
{
if (InitializePrinting())
{
PrintPreviewDialog printPreviewDialog
= new PrintPreviewDialog();
printPreviewDialog.Document
= printDocument1;
printPreviewDialog.ShowDialog();
}
}

里面有个InitiallizePrinting()方法也是自定义的代码如下:

View Code
//定义一个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;

printDocument1.DocumentName
= "员工考勤基本信息";
printDocument1.PrinterSettings
= printDialog.PrinterSettings;
printDocument1.DefaultPageSettings
= printDialog.PrinterSettings.DefaultPageSettings;
printDocument1.DefaultPageSettings.Margins
= new Margins(40, 40, 40, 40);

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

以上就是关于打印DataGirdView控件中数据的方法,需要的朋友看下吧,尤其是那个外国朋友的打印类还值得好好看看。

posted @ 2011-05-20 12:30  亿典通柄棋  阅读(3641)  评论(1编辑  收藏  举报