天天看點

推薦一款DataGridView的列印解決方案

今天有朋友請教在CS的WinForm中如何列印DataGridView中的内容。

效果圖

【列印設定畫面】

推薦一款DataGridView的列印解決方案

【列印預覽畫面】

推薦一款DataGridView的列印解決方案

解決方案構成

這個列印解決方案由一個列印設定的窗體,及一個列印類組成。

可用于以下場景:

1、顯示的資料量較大,但又沒有必要列印全部資料的時候

2、希望列印出的列寬能自動适應頁面寬度

列印類主要方法

<code>Print_DataGridView(共有)</code>: 被外部類調用的主方法.

<code>PrintDoc_BeginPrint(私有)</code>: 初始化一些列印變量

<code>PrintDoc_PrintPage(私有)</code>: 執行列印工作

<code>DrawFooter(私有)</code>: 頁腳的處理部分

列印類代碼

推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款DataGridView的列印解決方案

{

推薦一款DataGridView的列印解決方案

    class PrintDGV

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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&lt;string&gt; SelectedColumns = new List&lt;string&gt;();   // The Columns Selected by user to print.

推薦一款DataGridView的列印解決方案

        private static List&lt;string&gt; AvailableColumns = new List&lt;string&gt;();  // 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的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

            PrintPreviewDialog ppvw;

推薦一款DataGridView的列印解決方案

            try 

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);                

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

            finally

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

        }

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

        private static void PrintDoc_BeginPrint(object sender, 

推薦一款DataGridView的列印解決方案

                    System.Drawing.Printing.PrintEventArgs e) 

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

            try

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

        private static void PrintDoc_PrintPage(object sender, 

推薦一款DataGridView的列印解決方案

                    System.Drawing.Printing.PrintPageEventArgs e) 

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

            int tmpWidth, i;

推薦一款DataGridView的列印解決方案

            int tmpTop = e.MarginBounds.Top;

推薦一款DataGridView的列印解決方案

            int tmpLeft = e.MarginBounds.Left;

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

{            

推薦一款DataGridView的列印解決方案

                // Before starting first page, it saves Width &amp; Height of Headers and CoulmnType

推薦一款DataGridView的列印解決方案

                if (PageNo == 1) 

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                    foreach (DataGridViewColumn GridCol in dgv.Columns)

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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 &amp; 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 &lt;= dgv.Rows.Count - 1)

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                    DataGridViewRow GridRow = dgv.Rows[RowPos];

推薦一款DataGridView的列印解決方案

                    if (GridRow.IsNewRow || (!PrintAllRows &amp;&amp; !GridRow.Selected))

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                        RowPos++;

推薦一款DataGridView的列印解決方案

                        continue;

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                    CellHeight = GridRow.Height;

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                    if (tmpTop + CellHeight &gt;= e.MarginBounds.Height + e.MarginBounds.Top)

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                        DrawFooter(e, RowsPerPage);

推薦一款DataGridView的列印解決方案

                        NewPage = true;

推薦一款DataGridView的列印解決方案

                        PageNo++;

推薦一款DataGridView的列印解決方案

                        e.HasMorePages = true;

推薦一款DataGridView的列印解決方案

                        return;

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                    else

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                        if (NewPage)

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款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的列印解決方案
推薦一款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(0, 0, 

推薦一款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的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                                CellCheckBox.Size = new Size(14, 14);

推薦一款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(0, 0, 

推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                            // For the ComboBox Column

推薦一款DataGridView的列印解決方案

                            else if (((Type) ColumnTypes[i]).Name == "DataGridViewComboBoxColumn")

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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(0, 0, 

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案
推薦一款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 == 0) return;

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                // Write Footer (Page Number)

推薦一款DataGridView的列印解決方案

                DrawFooter(e, RowsPerPage);

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

                e.HasMorePages = false;

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

        private static void DrawFooter(System.Drawing.Printing.PrintPageEventArgs e, 

推薦一款DataGridView的列印解決方案

                    int RowsPerPage)

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

            double cnt = 0; 

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案

            // Detemining rows number to print

推薦一款DataGridView的列印解決方案

            if (PrintAllRows)

推薦一款DataGridView的列印解決方案
推薦一款DataGridView的列印解決方案
推薦一款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的列印解決方案

示例工程下載下傳:

<a href="http://files.cnblogs.com/heekui/testPrint.rar">testPrint</a>

繼續閱讀