推荐一款DataGridView的打印解决方案


转自:http://www.cnblogs.com/heekui/archive/2007/05/29/764531.html

在CS的WinForm中如何打印DataGridView中的内容。
网上搜索一番之后,还是在藏宝库CodeProject中找到一篇好文章《DataGridView Printing by Selecting Columns and Rows》(http://www.codeproject.com/KB/grid/PrintDataGrid_CS.aspx

效果图
【打印设置画面】

推荐一款DataGridView的打印解决方案

【打印预览画面】
推荐一款DataGridView的打印解决方案

解决方案构成
这个打印解决方案由一个打印设置的窗体,及一个打印类组成。
可用于以下场景:
1、显示的数据量较大,但又没有必要打印全部数据的时候
2、希望打印出的列宽能自动适应页面宽度

打印类主要方法
Print_DataGridView(共有): 被外部类调用的主方法.
PrintDoc_BeginPrint(私有):初始化一些打印变量
PrintDoc_PrintPage(私有):执行打印工作
DrawFooter(私有):页脚的处理部分

打印类代码

推荐一款DataGridView的打印解决方案/****************************************************
推荐一款DataGridView的打印解决方案*DataGridView打印类
推荐一款DataGridView的打印解决方案*原作者:AfrasiabCheraghi.
推荐一款DataGridView的打印解决方案*修改者:何奎
推荐一款DataGridView的打印解决方案*
推荐一款DataGridView的打印解决方案**************************************************
*/

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
usingSystem;
推荐一款DataGridView的打印解决方案
usingSystem.Collections.Generic;
推荐一款DataGridView的打印解决方案
usingSystem.Windows.Forms;
推荐一款DataGridView的打印解决方案
usingSystem.Drawing;
推荐一款DataGridView的打印解决方案
usingSystem.Collections;
推荐一款DataGridView的打印解决方案
usingSystem.Data;
推荐一款DataGridView的打印解决方案
usingSystem.Text;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
namespacetestPrint
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
classPrintDGV
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
privatestaticStringFormatStrFormat;//HoldscontentofaTextBoxCelltowritebyDrawString
推荐一款DataGridView的打印解决方案
privatestaticStringFormatStrFormatComboBox;//HoldscontentofaBooleanCelltowritebyDrawImage
推荐一款DataGridView的打印解决方案
privatestaticButtonCellButton;//HoldstheContentsofButtonCell
推荐一款DataGridView的打印解决方案
privatestaticCheckBoxCellCheckBox;//HoldstheContentsofCheckBoxCell
推荐一款DataGridView的打印解决方案
privatestaticComboBoxCellComboBox;//HoldstheContentsofComboBoxCell
推荐一款DataGridView的打印解决方案

推荐一款DataGridView的打印解决方案
privatestaticintTotalWidth;//SummationofColumnswidths
推荐一款DataGridView的打印解决方案
privatestaticintRowPos;//Positionofcurrentlyprintingrow
推荐一款DataGridView的打印解决方案
privatestaticboolNewPage;//Indicatesifanewpagereached
推荐一款DataGridView的打印解决方案
privatestaticintPageNo;//Numberofpagestoprint
推荐一款DataGridView的打印解决方案
privatestaticArrayListColumnLefts=newArrayList();//LeftCoordinateofColumns
推荐一款DataGridView的打印解决方案
privatestaticArrayListColumnWidths=newArrayList();//WidthofColumns
推荐一款DataGridView的打印解决方案
privatestaticArrayListColumnTypes=newArrayList();//DataTypeofColumns
推荐一款DataGridView的打印解决方案
privatestaticintCellHeight;//HeightofDataGridCell
推荐一款DataGridView的打印解决方案
privatestaticintRowsPerPage;//NumberofRowsperPage
推荐一款DataGridView的打印解决方案
privatestaticSystem.Drawing.Printing.PrintDocumentprintDoc=
推荐一款DataGridView的打印解决方案
newSystem.Drawing.Printing.PrintDocument();//PrintDocumnetObjectusedforprinting
推荐一款DataGridView的打印解决方案

推荐一款DataGridView的打印解决方案
privatestaticstringPrintTitle="";//Headerofpages
推荐一款DataGridView的打印解决方案
privatestaticDataGridViewdgv;//HoldsDataGridViewObjecttoprintitscontents
推荐一款DataGridView的打印解决方案
privatestaticList<string>SelectedColumns=newList<string>();//TheColumnsSelectedbyusertoprint.
推荐一款DataGridView的打印解决方案
privatestaticList<string>AvailableColumns=newList<string>();//AllColumnsavaiableinDataGrid
推荐一款DataGridView的打印解决方案
privatestaticboolPrintAllRows=true;//True=printallrows,False=printselectedrows
推荐一款DataGridView的打印解决方案
privatestaticboolFitToPageWidth=true;//True=Fitsselectedcolumnstopagewidth,False=Printcolumnsasshowed
推荐一款DataGridView的打印解决方案
privatestaticintHeaderHeight=0;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
publicstaticvoidPrint_DataGridView(DataGridViewdgv1)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案PrintPreviewDialogppvw;
推荐一款DataGridView的打印解决方案
try
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
//GettingDataGridViewobjecttoprint
推荐一款DataGridView的打印解决方案
dgv=dgv1;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//GettingallCoulmnsNamesintheDataGridView
推荐一款DataGridView的打印解决方案
AvailableColumns.Clear();
推荐一款DataGridView的打印解决方案
foreach(DataGridViewColumncindgv.Columns)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(!c.Visible)continue;
推荐一款DataGridView的打印解决方案AvailableColumns.Add(c.HeaderText);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//ShowingthePrintOptionForm
推荐一款DataGridView的打印解决方案
PrintOptionsdlg=newPrintOptions(AvailableColumns);
推荐一款DataGridView的打印解决方案
if(dlg.ShowDialog()!=DialogResult.OK)return;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案PrintTitle
=dlg.PrintTitle;
推荐一款DataGridView的打印解决方案PrintAllRows
=dlg.PrintAllRows;
推荐一款DataGridView的打印解决方案FitToPageWidth
=dlg.FitToPageWidth;
推荐一款DataGridView的打印解决方案SelectedColumns
=dlg.GetSelectedColumns();
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案RowsPerPage
=0;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案ppvw
=newPrintPreviewDialog();
推荐一款DataGridView的打印解决方案ppvw.Document
=printDoc;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//ShowingthePrintPreviewPage
推荐一款DataGridView的打印解决方案
printDoc.BeginPrint+=newSystem.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
推荐一款DataGridView的打印解决方案printDoc.PrintPage
+=newSystem.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
推荐一款DataGridView的打印解决方案
if(ppvw.ShowDialog()!=DialogResult.OK)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案printDoc.BeginPrint
-=newSystem.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
推荐一款DataGridView的打印解决方案printDoc.PrintPage
-=newSystem.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
推荐一款DataGridView的打印解决方案
return;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//PrintingtheDocumnet
推荐一款DataGridView的打印解决方案
printDoc.Print();
推荐一款DataGridView的打印解决方案printDoc.BeginPrint
-=newSystem.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
推荐一款DataGridView的打印解决方案printDoc.PrintPage
-=newSystem.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
catch(Exceptionex)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案MessageBox.Show(ex.Message,
"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
finally
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
privatestaticvoidPrintDoc_BeginPrint(objectsender,
推荐一款DataGridView的打印解决方案System.Drawing.Printing.PrintEventArgse)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
try
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
//FormattingtheContentofTextCelltoprint
推荐一款DataGridView的打印解决方案
StrFormat=newStringFormat();
推荐一款DataGridView的打印解决方案StrFormat.Alignment
=StringAlignment.Near;
推荐一款DataGridView的打印解决方案StrFormat.LineAlignment
=StringAlignment.Center;
推荐一款DataGridView的打印解决方案StrFormat.Trimming
=StringTrimming.EllipsisCharacter;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//FormattingtheContentofComboCellstoprint
推荐一款DataGridView的打印解决方案
StrFormatComboBox=newStringFormat();
推荐一款DataGridView的打印解决方案StrFormatComboBox.LineAlignment
=StringAlignment.Center;
推荐一款DataGridView的打印解决方案StrFormatComboBox.FormatFlags
=StringFormatFlags.NoWrap;
推荐一款DataGridView的打印解决方案StrFormatComboBox.Trimming
=StringTrimming.EllipsisCharacter;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案ColumnLefts.Clear();
推荐一款DataGridView的打印解决方案ColumnWidths.Clear();
推荐一款DataGridView的打印解决方案ColumnTypes.Clear();
推荐一款DataGridView的打印解决方案CellHeight
=0;
推荐一款DataGridView的打印解决方案RowsPerPage
=0;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//Forvariouscolumntypes
推荐一款DataGridView的打印解决方案
CellButton=newButton();
推荐一款DataGridView的打印解决方案CellCheckBox
=newCheckBox();
推荐一款DataGridView的打印解决方案CellComboBox
=newComboBox();
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//CalculatingTotalWidths
推荐一款DataGridView的打印解决方案
TotalWidth=0;
推荐一款DataGridView的打印解决方案
foreach(DataGridViewColumnGridColindgv.Columns)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(!GridCol.Visible)continue;
推荐一款DataGridView的打印解决方案
if(!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText))continue;
推荐一款DataGridView的打印解决方案TotalWidth
+=GridCol.Width;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案PageNo
=1;
推荐一款DataGridView的打印解决方案NewPage
=true;
推荐一款DataGridView的打印解决方案RowPos
=0;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
catch(Exceptionex)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案MessageBox.Show(ex.Message,
"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
privatestaticvoidPrintDoc_PrintPage(objectsender,
推荐一款DataGridView的打印解决方案System.Drawing.Printing.PrintPageEventArgse)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
inttmpWidth,i;
推荐一款DataGridView的打印解决方案
inttmpTop=e.MarginBounds.Top;
推荐一款DataGridView的打印解决方案
inttmpLeft=e.MarginBounds.Left;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
try
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
//Beforestartingfirstpage,itsavesWidth&HeightofHeadersandCoulmnType
推荐一款DataGridView的打印解决方案
if(PageNo==1)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
foreach(DataGridViewColumnGridColindgv.Columns)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(!GridCol.Visible)continue;
推荐一款DataGridView的打印解决方案
//Skipifthecurrentcolumnnotselected
推荐一款DataGridView的打印解决方案
if(!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText))continue;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//Deteminingwhetherthecolumnsarefittedtopageornot.
推荐一款DataGridView的打印解决方案
if(FitToPageWidth)
推荐一款DataGridView的打印解决方案tmpWidth
=(int)(Math.Floor((double)((double)GridCol.Width/
推荐一款DataGridView的打印解决方案(
double)TotalWidth*(double)TotalWidth*
推荐一款DataGridView的打印解决方案((
double)e.MarginBounds.Width/(double)TotalWidth))));
推荐一款DataGridView的打印解决方案
else
推荐一款DataGridView的打印解决方案tmpWidth
=GridCol.Width;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案HeaderHeight
=(int)(e.Graphics.MeasureString(GridCol.HeaderText,
推荐一款DataGridView的打印解决方案GridCol.InheritedStyle.Font,tmpWidth).Height)
+11;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//Savewidth&heightofheadresandColumnType
推荐一款DataGridView的打印解决方案
ColumnLefts.Add(tmpLeft);
推荐一款DataGridView的打印解决方案ColumnWidths.Add(tmpWidth);
推荐一款DataGridView的打印解决方案ColumnTypes.Add(GridCol.GetType());
推荐一款DataGridView的打印解决方案tmpLeft
+=tmpWidth;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//PrintingCurrentPage,RowbyRow
推荐一款DataGridView的打印解决方案
while(RowPos<=dgv.Rows.Count-1)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案DataGridViewRowGridRow
=dgv.Rows[RowPos];
推荐一款DataGridView的打印解决方案
if(GridRow.IsNewRow||(!PrintAllRows&&!GridRow.Selected))
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案RowPos
++;
推荐一款DataGridView的打印解决方案
continue;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案CellHeight
=GridRow.Height;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
if(tmpTop+CellHeight>=e.MarginBounds.Height+e.MarginBounds.Top)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案DrawFooter(e,RowsPerPage);
推荐一款DataGridView的打印解决方案NewPage
=true;
推荐一款DataGridView的打印解决方案PageNo
++;
推荐一款DataGridView的打印解决方案e.HasMorePages
=true;
推荐一款DataGridView的打印解决方案
return;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
else
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(NewPage)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
//DrawHeader
推荐一款DataGridView的打印解决方案
e.Graphics.DrawString(PrintTitle,newFont(dgv.Font,FontStyle.Bold),
推荐一款DataGridView的打印解决方案Brushes.Black,e.MarginBounds.Left,e.MarginBounds.Top
-
推荐一款DataGridView的打印解决方案e.Graphics.MeasureString(PrintTitle,
newFont(dgv.Font,
推荐一款DataGridView的打印解决方案FontStyle.Bold),e.MarginBounds.Width).Height
-13);
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案Strings
=DateTime.Now.ToLongDateString()+""+DateTime.Now.ToShortTimeString();
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案e.Graphics.DrawString(s,
newFont(dgv.Font,FontStyle.Bold),
推荐一款DataGridView的打印解决方案Brushes.Black,e.MarginBounds.Left
+(e.MarginBounds.Width-
推荐一款DataGridView的打印解决方案e.Graphics.MeasureString(s,
newFont(dgv.Font,
推荐一款DataGridView的打印解决方案FontStyle.Bold),e.MarginBounds.Width).Width),e.MarginBounds.Top
-
推荐一款DataGridView的打印解决方案e.Graphics.MeasureString(PrintTitle,
newFont(newFont(dgv.Font,
推荐一款DataGridView的打印解决方案FontStyle.Bold),FontStyle.Bold),e.MarginBounds.Width).Height
-13);
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//DrawColumns
推荐一款DataGridView的打印解决方案
tmpTop=e.MarginBounds.Top;
推荐一款DataGridView的打印解决方案i
=0;
推荐一款DataGridView的打印解决方案
foreach(DataGridViewColumnGridColindgv.Columns)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(!GridCol.Visible)continue;
推荐一款DataGridView的打印解决方案
if(!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText))
推荐一款DataGridView的打印解决方案
continue;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案e.Graphics.FillRectangle(
newSolidBrush(Color.LightGray),
推荐一款DataGridView的打印解决方案
newRectangle((int)ColumnLefts[i],tmpTop,
推荐一款DataGridView的打印解决方案(
int)ColumnWidths[i],HeaderHeight));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案e.Graphics.DrawRectangle(Pens.Black,
推荐一款DataGridView的打印解决方案
newRectangle((int)ColumnLefts[i],tmpTop,
推荐一款DataGridView的打印解决方案(
int)ColumnWidths[i],HeaderHeight));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案e.Graphics.DrawString(GridCol.HeaderText,GridCol.InheritedStyle.Font,
推荐一款DataGridView的打印解决方案
newSolidBrush(GridCol.InheritedStyle.ForeColor),
推荐一款DataGridView的打印解决方案
newRectangleF((int)ColumnLefts[i],tmpTop,
推荐一款DataGridView的打印解决方案(
int)ColumnWidths[i],HeaderHeight),StrFormat);
推荐一款DataGridView的打印解决方案i
++;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案NewPage
=false;
推荐一款DataGridView的打印解决方案tmpTop
+=HeaderHeight;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//DrawColumnsContents
推荐一款DataGridView的打印解决方案
i=0;
推荐一款DataGridView的打印解决方案
foreach(DataGridViewCellCelinGridRow.Cells)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(!Cel.OwningColumn.Visible)continue;
推荐一款DataGridView的打印解决方案
if(!SelectedColumns.Contains(Cel.OwningColumn.HeaderText))
推荐一款DataGridView的打印解决方案
continue;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//FortheTextBoxColumn
推荐一款DataGridView的打印解决方案
if(((Type)ColumnTypes[i]).Name=="DataGridViewTextBoxColumn"||
推荐一款DataGridView的打印解决方案((Type)ColumnTypes[i]).Name
=="DataGridViewLinkColumn")
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案e.Graphics.DrawString(Cel.Value.ToString(),Cel.InheritedStyle.Font,
推荐一款DataGridView的打印解决方案
newSolidBrush(Cel.InheritedStyle.ForeColor),
推荐一款DataGridView的打印解决方案
newRectangleF((int)ColumnLefts[i],(float)tmpTop,
推荐一款DataGridView的打印解决方案(
int)ColumnWidths[i],(float)CellHeight),StrFormat);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
//FortheButtonColumn
推荐一款DataGridView的打印解决方案
elseif(((Type)ColumnTypes[i]).Name=="DataGridViewButtonColumn")
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案CellButton.Text
=Cel.Value.ToString();
推荐一款DataGridView的打印解决方案CellButton.Size
=newSize((int)ColumnWidths[i],CellHeight);
推荐一款DataGridView的打印解决方案Bitmapbmp
=newBitmap(CellButton.Width,CellButton.Height);
推荐一款DataGridView的打印解决方案CellButton.DrawToBitmap(bmp,
newRectangle(0,0,
推荐一款DataGridView的打印解决方案bmp.Width,bmp.Height));
推荐一款DataGridView的打印解决方案e.Graphics.DrawImage(bmp,
newPoint((int)ColumnLefts[i],tmpTop));
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
//FortheCheckBoxColumn
推荐一款DataGridView的打印解决方案
elseif(((Type)ColumnTypes[i]).Name=="DataGridViewCheckBoxColumn")
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案CellCheckBox.Size
=newSize(14,14);
推荐一款DataGridView的打印解决方案CellCheckBox.Checked
=(bool)Cel.Value;
推荐一款DataGridView的打印解决方案Bitmapbmp
=newBitmap((int)ColumnWidths[i],CellHeight);
推荐一款DataGridView的打印解决方案GraphicstmpGraphics
=Graphics.FromImage(bmp);
推荐一款DataGridView的打印解决方案tmpGraphics.FillRectangle(Brushes.White,
newRectangle(0,0,
推荐一款DataGridView的打印解决方案bmp.Width,bmp.Height));
推荐一款DataGridView的打印解决方案CellCheckBox.DrawToBitmap(bmp,
推荐一款DataGridView的打印解决方案
newRectangle((int)((bmp.Width-CellCheckBox.Width)/2),
推荐一款DataGridView的打印解决方案(
int)((bmp.Height-CellCheckBox.Height)/2),
推荐一款DataGridView的打印解决方案CellCheckBox.Width,CellCheckBox.Height));
推荐一款DataGridView的打印解决方案e.Graphics.DrawImage(bmp,
newPoint((int)ColumnLefts[i],tmpTop));
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
//FortheComboBoxColumn
推荐一款DataGridView的打印解决方案
elseif(((Type)ColumnTypes[i]).Name=="DataGridViewComboBoxColumn")
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案CellComboBox.Size
=newSize((int)ColumnWidths[i],CellHeight);
推荐一款DataGridView的打印解决方案Bitmapbmp
=newBitmap(CellComboBox.Width,CellComboBox.Height);
推荐一款DataGridView的打印解决方案CellComboBox.DrawToBitmap(bmp,
newRectangle(0,0,
推荐一款DataGridView的打印解决方案bmp.Width,bmp.Height));
推荐一款DataGridView的打印解决方案e.Graphics.DrawImage(bmp,
newPoint((int)ColumnLefts[i],tmpTop));
推荐一款DataGridView的打印解决方案e.Graphics.DrawString(Cel.Value.ToString(),Cel.InheritedStyle.Font,
推荐一款DataGridView的打印解决方案
newSolidBrush(Cel.InheritedStyle.ForeColor),
推荐一款DataGridView的打印解决方案
newRectangleF((int)ColumnLefts[i]+1,tmpTop,(int)ColumnWidths[i]
推荐一款DataGridView的打印解决方案
-16,CellHeight),StrFormatComboBox);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
//FortheImageColumn
推荐一款DataGridView的打印解决方案
elseif(((Type)ColumnTypes[i]).Name=="DataGridViewImageColumn")
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案RectangleCelSize
=newRectangle((int)ColumnLefts[i],
推荐一款DataGridView的打印解决方案tmpTop,(
int)ColumnWidths[i],CellHeight);
推荐一款DataGridView的打印解决方案SizeImgSize
=((Image)(Cel.FormattedValue)).Size;
推荐一款DataGridView的打印解决方案e.Graphics.DrawImage((Image)Cel.FormattedValue,
推荐一款DataGridView的打印解决方案
newRectangle((int)ColumnLefts[i]+(int)((CelSize.Width-ImgSize.Width)/2),
推荐一款DataGridView的打印解决方案tmpTop
+(int)((CelSize.Height-ImgSize.Height)/2),
推荐一款DataGridView的打印解决方案((Image)(Cel.FormattedValue)).Width,((Image)(Cel.FormattedValue)).Height));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//DrawingCellsBorders
推荐一款DataGridView的打印解决方案
e.Graphics.DrawRectangle(Pens.Black,newRectangle((int)ColumnLefts[i],
推荐一款DataGridView的打印解决方案tmpTop,(
int)ColumnWidths[i],CellHeight));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案i
++;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案tmpTop
+=CellHeight;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案RowPos
++;
推荐一款DataGridView的打印解决方案
//ForthefirstpageitcalculatesRowsperPage
推荐一款DataGridView的打印解决方案
if(PageNo==1)RowsPerPage++;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
if(RowsPerPage==0)return;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//WriteFooter(PageNumber)
推荐一款DataGridView的打印解决方案
DrawFooter(e,RowsPerPage);
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案e.HasMorePages
=false;
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
catch(Exceptionex)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案MessageBox.Show(ex.Message,
"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
privatestaticvoidDrawFooter(System.Drawing.Printing.PrintPageEventArgse,
推荐一款DataGridView的打印解决方案
intRowsPerPage)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
doublecnt=0;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//Deteminingrowsnumbertoprint
推荐一款DataGridView的打印解决方案
if(PrintAllRows)
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案
if(dgv.Rows[dgv.Rows.Count-1].IsNewRow)
推荐一款DataGridView的打印解决方案cnt
=dgv.Rows.Count-2;//WhentheDataGridViewdoesn'tallowaddingrows
推荐一款DataGridView的打印解决方案
else
推荐一款DataGridView的打印解决方案cnt
=dgv.Rows.Count-1;//WhentheDataGridViewallowsaddingrows
推荐一款DataGridView的打印解决方案
}

推荐一款DataGridView的打印解决方案
else
推荐一款DataGridView的打印解决方案cnt
=dgv.SelectedRows.Count;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
//WritingthePageNumberontheBottomofPage
推荐一款DataGridView的打印解决方案
stringPageNum=""+PageNo.ToString()
推荐一款DataGridView的打印解决方案
+"页,共"+Math.Ceiling((double)(cnt/RowsPerPage)).ToString()
推荐一款DataGridView的打印解决方案
+"";
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案e.Graphics.DrawString(PageNum,dgv.Font,Brushes.Black,
推荐一款DataGridView的打印解决方案e.MarginBounds.Left
+(e.MarginBounds.Width-
推荐一款DataGridView的打印解决方案e.Graphics.MeasureString(PageNum,dgv.Font,
推荐一款DataGridView的打印解决方案e.MarginBounds.Width).Width)
/2,e.MarginBounds.Top+
推荐一款DataGridView的打印解决方案e.MarginBounds.Height
+31);
推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案}

推荐一款DataGridView的打印解决方案


示例工程下载:
testPrint