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

今天有朋友请教在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的打印解决方案 * 原作者:Afrasiab Cheraghi. 
推荐一款DataGridView的打印解决方案 * 修改者:何奎
推荐一款DataGridView的打印解决方案 * 
推荐一款DataGridView的打印解决方案 * *************************************************
*/

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
using  System;
推荐一款DataGridView的打印解决方案
using  System.Collections.Generic;
推荐一款DataGridView的打印解决方案
using  System.Windows.Forms;
推荐一款DataGridView的打印解决方案
using  System.Drawing;
推荐一款DataGridView的打印解决方案
using  System.Collections;
推荐一款DataGridView的打印解决方案
using  System.Data;
推荐一款DataGridView的打印解决方案
using  System.Text;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案
namespace  testPrint
推荐一款DataGridView的打印解决方案
{
推荐一款DataGridView的打印解决方案    
class PrintDGV
推荐一款DataGridView的打印解决方案    
{
推荐一款DataGridView的打印解决方案        
private static StringFormat StrFormat;  // Holds content of a TextBox Cell to write by DrawString
推荐一款DataGridView的打印解决方案
        private static StringFormat StrFormatComboBox; // Holds content of a Boolean Cell to write by DrawImage
推荐一款DataGridView的打印解决方案
        private static Button CellButton;       // Holds the Contents of Button Cell
推荐一款DataGridView的打印解决方案
        private static CheckBox CellCheckBox;   // Holds the Contents of CheckBox Cell 
推荐一款DataGridView的打印解决方案
        private static ComboBox CellComboBox;   // Holds the Contents of ComboBox Cell
推荐一款DataGridView的打印解决方案

推荐一款DataGridView的打印解决方案        
private static int TotalWidth;          // Summation of Columns widths
推荐一款DataGridView的打印解决方案
        private static int RowPos;              // Position of currently printing row 
推荐一款DataGridView的打印解决方案
        private static bool NewPage;            // Indicates if a new page reached
推荐一款DataGridView的打印解决方案
        private static int PageNo;              // Number of pages to print
推荐一款DataGridView的打印解决方案
        private static ArrayList ColumnLefts = new ArrayList();  // Left Coordinate of Columns
推荐一款DataGridView的打印解决方案
        private static ArrayList ColumnWidths = new ArrayList(); // Width of Columns
推荐一款DataGridView的打印解决方案
        private static ArrayList ColumnTypes = new ArrayList();  // DataType of Columns
推荐一款DataGridView的打印解决方案
        private static int CellHeight;          // Height of DataGrid Cell
推荐一款DataGridView的打印解决方案
        private static int RowsPerPage;         // Number of Rows per Page
推荐一款DataGridView的打印解决方案
        private static System.Drawing.Printing.PrintDocument printDoc =
推荐一款DataGridView的打印解决方案                       
new System.Drawing.Printing.PrintDocument();  // PrintDocumnet Object used for printing
推荐一款DataGridView的打印解决方案

推荐一款DataGridView的打印解决方案        
private static string PrintTitle = "";  // Header of pages
推荐一款DataGridView的打印解决方案
        private static DataGridView dgv;        // Holds DataGridView Object to print its contents
推荐一款DataGridView的打印解决方案
        private static List<string> SelectedColumns = new List<string>();   // The Columns Selected by user to print.
推荐一款DataGridView的打印解决方案
        private static List<string> AvailableColumns = new List<string>();  // All Columns avaiable in DataGrid 
推荐一款DataGridView的打印解决方案
        private static bool PrintAllRows = true;   // True = print all rows,  False = print selected rows    
推荐一款DataGridView的打印解决方案
        private static bool FitToPageWidth = true// True = Fits selected columns to page width ,  False = Print columns as showed    
推荐一款DataGridView的打印解决方案
        private static int HeaderHeight = 0;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案        
public static void Print_DataGridView(DataGridView dgv1)
推荐一款DataGridView的打印解决方案        
{
推荐一款DataGridView的打印解决方案            PrintPreviewDialog ppvw;
推荐一款DataGridView的打印解决方案            
try 
推荐一款DataGridView的打印解决方案            
{    
推荐一款DataGridView的打印解决方案                
// Getting DataGridView object to print
推荐一款DataGridView的打印解决方案
                dgv = dgv1;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                
// Getting all Coulmns Names in the DataGridView
推荐一款DataGridView的打印解决方案
                AvailableColumns.Clear();
推荐一款DataGridView的打印解决方案                
foreach (DataGridViewColumn c in dgv.Columns)
推荐一款DataGridView的打印解决方案                
{
推荐一款DataGridView的打印解决方案                    
if (!c.Visible) continue;
推荐一款DataGridView的打印解决方案                    AvailableColumns.Add(c.HeaderText);
推荐一款DataGridView的打印解决方案                }

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                
// Showing the PrintOption Form
推荐一款DataGridView的打印解决方案
                PrintOptions dlg = new PrintOptions(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 
= new PrintPreviewDialog();
推荐一款DataGridView的打印解决方案                ppvw.Document 
= printDoc;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                
// Showing the Print Preview Page
推荐一款DataGridView的打印解决方案
                printDoc.BeginPrint +=new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
推荐一款DataGridView的打印解决方案                printDoc.PrintPage 
+=new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
推荐一款DataGridView的打印解决方案                
if (ppvw.ShowDialog() != DialogResult.OK)
推荐一款DataGridView的打印解决方案                
{
推荐一款DataGridView的打印解决方案                    printDoc.BeginPrint 
-= new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
推荐一款DataGridView的打印解决方案                    printDoc.PrintPage 
-= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
推荐一款DataGridView的打印解决方案                    
return;
推荐一款DataGridView的打印解决方案                }

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

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

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

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

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案        
private static void PrintDoc_BeginPrint(object sender, 
推荐一款DataGridView的打印解决方案                    System.Drawing.Printing.PrintEventArgs e) 
推荐一款DataGridView的打印解决方案        
{
推荐一款DataGridView的打印解决方案            
try
推荐一款DataGridView的打印解决方案            
{
推荐一款DataGridView的打印解决方案                
// Formatting the Content of Text Cell to print
推荐一款DataGridView的打印解决方案
                StrFormat = new StringFormat();
推荐一款DataGridView的打印解决方案                StrFormat.Alignment 
= StringAlignment.Near;
推荐一款DataGridView的打印解决方案                StrFormat.LineAlignment 
= StringAlignment.Center;
推荐一款DataGridView的打印解决方案                StrFormat.Trimming 
= StringTrimming.EllipsisCharacter;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                
// Formatting the Content of Combo Cells to print
推荐一款DataGridView的打印解决方案
                StrFormatComboBox = new StringFormat();
推荐一款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的打印解决方案                
// For various column types
推荐一款DataGridView的打印解决方案
                CellButton = new Button();
推荐一款DataGridView的打印解决方案                CellCheckBox 
= new CheckBox();
推荐一款DataGridView的打印解决方案                CellComboBox 
= new ComboBox();
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                
// Calculating Total Widths
推荐一款DataGridView的打印解决方案
                TotalWidth = 0;
推荐一款DataGridView的打印解决方案                
foreach (DataGridViewColumn GridCol in dgv.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 (Exception ex)
推荐一款DataGridView的打印解决方案            
{
推荐一款DataGridView的打印解决方案                MessageBox.Show(ex.Message, 
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);                
推荐一款DataGridView的打印解决方案            }

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

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案        
private static void PrintDoc_PrintPage(object sender, 
推荐一款DataGridView的打印解决方案                    System.Drawing.Printing.PrintPageEventArgs e) 
推荐一款DataGridView的打印解决方案        
{
推荐一款DataGridView的打印解决方案            
int tmpWidth, i;
推荐一款DataGridView的打印解决方案            
int tmpTop = e.MarginBounds.Top;
推荐一款DataGridView的打印解决方案            
int tmpLeft = e.MarginBounds.Left;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案            
try 
推荐一款DataGridView的打印解决方案            
{            
推荐一款DataGridView的打印解决方案                
// Before starting first page, it saves Width & Height of Headers and CoulmnType
推荐一款DataGridView的打印解决方案
                if (PageNo == 1
推荐一款DataGridView的打印解决方案                
{
推荐一款DataGridView的打印解决方案                    
foreach (DataGridViewColumn GridCol in dgv.Columns)
推荐一款DataGridView的打印解决方案                    
{
推荐一款DataGridView的打印解决方案                        
if (!GridCol.Visible) continue;
推荐一款DataGridView的打印解决方案                        
// Skip if the current column not selected
推荐一款DataGridView的打印解决方案
                        if (!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText)) continue;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                        
// Detemining whether the columns are fitted to page or not.
推荐一款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的打印解决方案                        
// Save width & height of headres and ColumnType
推荐一款DataGridView的打印解决方案
                        ColumnLefts.Add(tmpLeft);
推荐一款DataGridView的打印解决方案                        ColumnWidths.Add(tmpWidth);
推荐一款DataGridView的打印解决方案                        ColumnTypes.Add(GridCol.GetType());
推荐一款DataGridView的打印解决方案                        tmpLeft 
+= tmpWidth;
推荐一款DataGridView的打印解决方案                    }

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

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                
// Printing Current Page, Row by Row
推荐一款DataGridView的打印解决方案
                while (RowPos <= dgv.Rows.Count - 1)
推荐一款DataGridView的打印解决方案                
{
推荐一款DataGridView的打印解决方案                    DataGridViewRow GridRow 
= 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的打印解决方案                            
// Draw Header
推荐一款DataGridView的打印解决方案
                            e.Graphics.DrawString(PrintTitle, new Font(dgv.Font, FontStyle.Bold), 
推荐一款DataGridView的打印解决方案                                    Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top 
-
推荐一款DataGridView的打印解决方案                            e.Graphics.MeasureString(PrintTitle, 
new Font(dgv.Font, 
推荐一款DataGridView的打印解决方案                                    FontStyle.Bold), e.MarginBounds.Width).Height 
- 13);
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                            String s 
= DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                            e.Graphics.DrawString(s, 
new Font(dgv.Font, FontStyle.Bold), 
推荐一款DataGridView的打印解决方案                                    Brushes.Black, e.MarginBounds.Left 
+ (e.MarginBounds.Width - 
推荐一款DataGridView的打印解决方案                                    e.Graphics.MeasureString(s, 
new Font(dgv.Font, 
推荐一款DataGridView的打印解决方案                                    FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top 
- 
推荐一款DataGridView的打印解决方案                                    e.Graphics.MeasureString(PrintTitle, 
new Font(new Font(dgv.Font, 
推荐一款DataGridView的打印解决方案                                    FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height 
- 13);
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                            
// Draw Columns
推荐一款DataGridView的打印解决方案
                            tmpTop = e.MarginBounds.Top;
推荐一款DataGridView的打印解决方案                            i 
= 0;
推荐一款DataGridView的打印解决方案                            
foreach (DataGridViewColumn GridCol in dgv.Columns)
推荐一款DataGridView的打印解决方案                            
{
推荐一款DataGridView的打印解决方案                                
if (!GridCol.Visible) continue;
推荐一款DataGridView的打印解决方案                                
if (!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText)) 
推荐一款DataGridView的打印解决方案                                    
continue;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                                e.Graphics.FillRectangle(
new SolidBrush(Color.LightGray), 
推荐一款DataGridView的打印解决方案                                    
new Rectangle((int) ColumnLefts[i], tmpTop,
推荐一款DataGridView的打印解决方案                                    (
int)ColumnWidths[i], HeaderHeight));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawRectangle(Pens.Black, 
推荐一款DataGridView的打印解决方案                                    
new Rectangle((int) ColumnLefts[i], tmpTop,
推荐一款DataGridView的打印解决方案                                    (
int)ColumnWidths[i], HeaderHeight));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font, 
推荐一款DataGridView的打印解决方案                                    
new SolidBrush(GridCol.InheritedStyle.ForeColor),
推荐一款DataGridView的打印解决方案                                    
new RectangleF((int)ColumnLefts[i], tmpTop, 
推荐一款DataGridView的打印解决方案                                    (
int)ColumnWidths[i], HeaderHeight), StrFormat);
推荐一款DataGridView的打印解决方案                                i
++;
推荐一款DataGridView的打印解决方案                            }

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

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                        
// Draw Columns Contents
推荐一款DataGridView的打印解决方案
                        i = 0;
推荐一款DataGridView的打印解决方案                        
foreach (DataGridViewCell Cel in GridRow.Cells)
推荐一款DataGridView的打印解决方案                        
{
推荐一款DataGridView的打印解决方案                            
if (!Cel.OwningColumn.Visible) continue;
推荐一款DataGridView的打印解决方案                            
if (!SelectedColumns.Contains(Cel.OwningColumn.HeaderText))
推荐一款DataGridView的打印解决方案                                
continue;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                            
// For the TextBox Column
推荐一款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的打印解决方案                                        
new SolidBrush(Cel.InheritedStyle.ForeColor),
推荐一款DataGridView的打印解决方案                                        
new RectangleF((int)ColumnLefts[i], (float)tmpTop,
推荐一款DataGridView的打印解决方案                                        (
int)ColumnWidths[i], (float)CellHeight), StrFormat);
推荐一款DataGridView的打印解决方案                            }

推荐一款DataGridView的打印解决方案                            
// For the Button Column
推荐一款DataGridView的打印解决方案
                            else if (((Type) ColumnTypes[i]).Name == "DataGridViewButtonColumn")
推荐一款DataGridView的打印解决方案                            
{
推荐一款DataGridView的打印解决方案                                CellButton.Text 
= Cel.Value.ToString();
推荐一款DataGridView的打印解决方案                                CellButton.Size 
= new Size((int)ColumnWidths[i], CellHeight);
推荐一款DataGridView的打印解决方案                                Bitmap bmp 
=new Bitmap(CellButton.Width, CellButton.Height);
推荐一款DataGridView的打印解决方案                                CellButton.DrawToBitmap(bmp, 
new Rectangle(00
推荐一款DataGridView的打印解决方案                                        bmp.Width, bmp.Height));
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawImage(bmp, 
new Point((int)ColumnLefts[i], tmpTop));
推荐一款DataGridView的打印解决方案                            }

推荐一款DataGridView的打印解决方案                            
// For the CheckBox Column
推荐一款DataGridView的打印解决方案
                            else if (((Type) ColumnTypes[i]).Name == "DataGridViewCheckBoxColumn")
推荐一款DataGridView的打印解决方案                            
{
推荐一款DataGridView的打印解决方案                                CellCheckBox.Size 
= new Size(1414);
推荐一款DataGridView的打印解决方案                                CellCheckBox.Checked 
= (bool)Cel.Value;
推荐一款DataGridView的打印解决方案                                Bitmap bmp 
= new Bitmap((int)ColumnWidths[i], CellHeight);
推荐一款DataGridView的打印解决方案                                Graphics tmpGraphics 
= Graphics.FromImage(bmp);
推荐一款DataGridView的打印解决方案                                tmpGraphics.FillRectangle(Brushes.White, 
new Rectangle(00
推荐一款DataGridView的打印解决方案                                        bmp.Width, bmp.Height));
推荐一款DataGridView的打印解决方案                                CellCheckBox.DrawToBitmap(bmp, 
推荐一款DataGridView的打印解决方案                                        
new Rectangle((int)((bmp.Width - CellCheckBox.Width) / 2), 
推荐一款DataGridView的打印解决方案                                        (
int)((bmp.Height - CellCheckBox.Height) / 2), 
推荐一款DataGridView的打印解决方案                                        CellCheckBox.Width, CellCheckBox.Height));
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawImage(bmp, 
new Point((int)ColumnLefts[i], tmpTop));
推荐一款DataGridView的打印解决方案                            }

推荐一款DataGridView的打印解决方案                            
// For the ComboBox Column
推荐一款DataGridView的打印解决方案
                            else if (((Type) ColumnTypes[i]).Name == "DataGridViewComboBoxColumn")
推荐一款DataGridView的打印解决方案                            
{
推荐一款DataGridView的打印解决方案                                CellComboBox.Size 
= new Size((int)ColumnWidths[i], CellHeight);
推荐一款DataGridView的打印解决方案                                Bitmap bmp 
= new Bitmap(CellComboBox.Width, CellComboBox.Height);
推荐一款DataGridView的打印解决方案                                CellComboBox.DrawToBitmap(bmp, 
new Rectangle(00
推荐一款DataGridView的打印解决方案                                        bmp.Width, bmp.Height));
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawImage(bmp, 
new Point((int)ColumnLefts[i], tmpTop));
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, 
推荐一款DataGridView的打印解决方案                                        
new SolidBrush(Cel.InheritedStyle.ForeColor), 
推荐一款DataGridView的打印解决方案                                        
new RectangleF((int)ColumnLefts[i] + 1, tmpTop, (int)ColumnWidths[i]
推荐一款DataGridView的打印解决方案                                        
- 16, CellHeight), StrFormatComboBox);
推荐一款DataGridView的打印解决方案                            }

推荐一款DataGridView的打印解决方案                            
// For the Image Column
推荐一款DataGridView的打印解决方案
                            else if (((Type) ColumnTypes[i]).Name == "DataGridViewImageColumn")
推荐一款DataGridView的打印解决方案                            
{
推荐一款DataGridView的打印解决方案                                Rectangle CelSize 
= new Rectangle((int)ColumnLefts[i], 
推荐一款DataGridView的打印解决方案                                        tmpTop, (
int)ColumnWidths[i], CellHeight);
推荐一款DataGridView的打印解决方案                                Size ImgSize 
= ((Image)(Cel.FormattedValue)).Size;
推荐一款DataGridView的打印解决方案                                e.Graphics.DrawImage((Image)Cel.FormattedValue, 
推荐一款DataGridView的打印解决方案                                        
new Rectangle((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的打印解决方案                            
// Drawing Cells Borders 
推荐一款DataGridView的打印解决方案
                            e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)ColumnLefts[i], 
推荐一款DataGridView的打印解决方案                                    tmpTop, (
int)ColumnWidths[i], CellHeight));
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                            i
++;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                        }

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

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案                    RowPos
++;
推荐一款DataGridView的打印解决方案                    
// For the first page it calculates Rows per Page
推荐一款DataGridView的打印解决方案
                    if (PageNo == 1) RowsPerPage++;
推荐一款DataGridView的打印解决方案                }

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

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

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

推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案        
private static void DrawFooter(System.Drawing.Printing.PrintPageEventArgs e, 
推荐一款DataGridView的打印解决方案                    
int RowsPerPage)
推荐一款DataGridView的打印解决方案        
{
推荐一款DataGridView的打印解决方案            
double cnt = 0
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案            
// Detemining rows number to print
推荐一款DataGridView的打印解决方案
            if (PrintAllRows)
推荐一款DataGridView的打印解决方案            
{
推荐一款DataGridView的打印解决方案                
if (dgv.Rows[dgv.Rows.Count - 1].IsNewRow) 
推荐一款DataGridView的打印解决方案                    cnt 
= dgv.Rows.Count - 2// When the DataGridView doesn't allow adding rows
推荐一款DataGridView的打印解决方案
                else
推荐一款DataGridView的打印解决方案                    cnt 
= dgv.Rows.Count - 1// When the DataGridView allows adding rows
推荐一款DataGridView的打印解决方案
            }

推荐一款DataGridView的打印解决方案            
else
推荐一款DataGridView的打印解决方案                cnt 
= dgv.SelectedRows.Count;
推荐一款DataGridView的打印解决方案
推荐一款DataGridView的打印解决方案            
// Writing the Page Number on the Bottom of Page
推荐一款DataGridView的打印解决方案
            string PageNum = " 第 " + 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)