实现DataGridView的打印

添加人:iyond五级(2401分)   添加时间:2007-08-13    阅读次数:2256  收藏此教程
  1using System;
  2using System.Collections.Generic;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Drawing;
  6using System.Text;
  7using System.Windows.Forms;
  8using System.Drawing.Printing;
  9using System.IO;
 10
 11namespace XXX
 12
 13{
 14    /// <summary>
 15    /// 实现DataGridView的打印
 16    /// </summary>

 17    public class PrintDataGridView
 18    {
 19        private static List<DataGridViewCellPrint> CellPrintList = new List<DataGridViewCellPrint>();
 20
 21        private static int printRowCount = 0;
 22
 23        private static bool IsPrint = true;
 24        private static bool IsRole = true;
 25        private static int PoXTmp = 0;
 26        private static int PoYTmp = 0;
 27        private static int WidthTmp = 0;
 28        private static int HeightTmp = 0;
 29        private static int RowIndex = 0;
 30                
 31        /// <summary>
 32        /// 打印DataGridView控件
 33        /// </summary>
 34        /// <param name="dataGridView">DataGridView控件</param>
 35        /// <param name="includeColumnText">是否包括列标题</param>
 36        /// <param name="e">为 System.Drawing.Printing.PrintDocument.PrintPage 事件提供数据。</param>
 37        /// <param name="PoX">起始X坐标</param>
 38        /// <param name="PoY">起始Y坐标</param>

 39        public static void Print(DataGridView dataGridView, bool includeColumnText, PrintPageEventArgs e, ref int PoX, ref int PoY)
 40        {
 41            try
 42            {
 43                if (PrintDataGridView.IsPrint)
 44                {
 45                    PrintDataGridView.printRowCount = 0;
 46                    PrintDataGridView.IsPrint = false;
 47                    PrintDataGridView.DataGridViewCellVsList(dataGridView, includeColumnText);
 48                    if (0 == PrintDataGridView.CellPrintList.Count)
 49                        return;
 50                    if (PoX > e.MarginBounds.Left)
 51                        PrintDataGridView.IsRole = true;
 52                    else
 53                        PrintDataGridView.IsRole = false;
 54                    PrintDataGridView.PoXTmp = PoX;
 55                    PrintDataGridView.PoYTmp = PoY;
 56                    PrintDataGridView.RowIndex = 0;
 57                    WidthTmp = 0;
 58                    HeightTmp = 0;
 59                }

 60                if (0 != PrintDataGridView.printRowCount)
 61                {
 62                    if (IsRole)
 63                    {
 64                        PoX = PoXTmp = e.MarginBounds.Left;
 65                        PoY = PoYTmp = e.MarginBounds.Top;
 66                    }

 67                    else
 68                    {
 69                        PoX = PoXTmp;
 70                        PoY = PoYTmp;
 71                    }

 72                }

 73                while (PrintDataGridView.printRowCount < PrintDataGridView.CellPrintList.Count)
 74                {
 75                    DataGridViewCellPrint CellPrint = CellPrintList[PrintDataGridView.printRowCount];
 76                    if (RowIndex == CellPrint.RowIndex)
 77                        PoX = PoX + WidthTmp;
 78                    else
 79                    {
 80                        PoX = PoXTmp;
 81                        PoY = PoY + HeightTmp;
 82                        if (PoY + HeightTmp > e.MarginBounds.Bottom)
 83                        {
 84                            HeightTmp = 0;
 85                            e.HasMorePages = true;
 86                            return;
 87                        }

 88                     }

 89                    using (SolidBrush solidBrush = new SolidBrush(CellPrint.BackColor))
 90                    {
 91                        RectangleF rectF1 = new RectangleF(PoX, PoY, CellPrint.Width, CellPrint.Height);
 92                        e.Graphics.FillRectangle(solidBrush, rectF1);
 93                        using (Pen pen = new Pen(Color.Black, 1))
 94                            e.Graphics.DrawRectangle(pen, Rectangle.Round(rectF1));
 95                        solidBrush.Color = CellPrint.ForeColor;
 96                        e.Graphics.DrawString(CellPrint.FormattedValue, CellPrint.Font, solidBrush, new Point(PoX + 2, PoY + 3));
 97                    }

 98                    WidthTmp = CellPrint.Width;
 99                    HeightTmp = CellPrint.Height;
100                    RowIndex = CellPrint.RowIndex;
101                    PrintDataGridView.printRowCount++;
102                }

103                PoY = PoY + HeightTmp;
104                e.HasMorePages = false;
105                PrintDataGridView.IsPrint = true;
106            }

107            catch
108            {
109                e.HasMorePages = false;
110                PrintDataGridView.IsPrint = true;
111                throw;
112            }

113            
114        }

115
116        /// <summary>
117        /// 将DataGridView控件内容转变到 CellPrintList
118        /// </summary>
119        /// <param name="dataGridView">DataGridView控件</param>
120        /// <param name="includeColumnText">是否包括列标题</param>

121        private static void DataGridViewCellVsList(DataGridView dataGridView, bool includeColumnText)
122        {
123            CellPrintList.Clear();
124            try
125            {
126                int rowsCount = dataGridView.Rows.Count;
127                int colsCount = dataGridView.Columns.Count;
128
129                //最后一行是供输入的行时,不用读数据。
130                if (dataGridView.Rows[rowsCount - 1].IsNewRow)
131                    rowsCount--;
132                //包括列标题
133                if (includeColumnText)
134                {
135                    for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)
136                    {
137                        if (dataGridView.Columns[columnsIndex].Visible)
138                        {
139                            DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();
140                            CellPrint.FormattedValue = dataGridView.Columns[columnsIndex].HeaderText;
141                            CellPrint.RowIndex = 0;
142                            CellPrint.ColumnIndex = columnsIndex;
143                            CellPrint.Font = dataGridView.Columns[columnsIndex].HeaderCell.Style.Font;
144                            CellPrint.BackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor;
145                            CellPrint.ForeColor = dataGridView.ColumnHeadersDefaultCellStyle.ForeColor;
146                            CellPrint.Width = dataGridView.Columns[columnsIndex].Width;
147                            CellPrint.Height = dataGridView.ColumnHeadersHeight;
148                            CellPrintList.Add(CellPrint);
149                        }

150                    }

151                }

152                //读取单元格数据
153                for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
154                {
155                    for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)
156                    {
157                        if (dataGridView.Columns[columnsIndex].Visible)
158                        {
159                            DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();
160                            CellPrint.FormattedValue = dataGridView.Rows[rowIndex].Cells[columnsIndex].FormattedValue.ToString();
161                            if (includeColumnText)
162                                CellPrint.RowIndex = rowIndex + 1;//假如包括列标题则从行号1开始
163                            else
164                                CellPrint.RowIndex = rowIndex;
165                            CellPrint.ColumnIndex = columnsIndex;
166                            CellPrint.Font = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.Font;
167                            System.Drawing.Color TmpColor = System.Drawing.Color.Empty;
168                            if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor)
169                                TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor;
170                            else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor)
171                                TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor;
172                            else
173                                TmpColor = dataGridView.DefaultCellStyle.BackColor;
174                            CellPrint.BackColor = TmpColor;
175                            TmpColor = System.Drawing.Color.Empty;
176                            if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor)
177                                TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor;
178                            else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor)
179                                TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor;
180                            else
181                                TmpColor = dataGridView.DefaultCellStyle.ForeColor;
182                            CellPrint.ForeColor = TmpColor;
183                            CellPrint.Width = dataGridView.Columns[columnsIndex].Width;
184                            CellPrint.Height = dataGridView.Rows[rowIndex].Height;
185                            CellPrintList.Add(CellPrint);
186                        }

187                    }

188                }

189            }

190            catch { throw; }
191        }

192
193        private class DataGridViewCellPrint
194        {
195            private string _FormattedValue = "";
196            private int _RowIndex = -1;
197            private int _ColumnIndex = -1;
198            private System.Drawing.Color _ForeColor = System.Drawing.Color.Black;
199            private System.Drawing.Color _BackColor = System.Drawing.Color.White;
200            private int _Width = 100;
201            private int _Height = 23;
202            private System.Drawing.Font _Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
203            /// <summary>
204            /// 获取或设置单元格的字体。
205            /// </summary>

206            public System.Drawing.Font Font
207            {
208                set { if (null != value) _Font = value; }
209                get { return _Font; }
210            }

211            /// <summary>
212            /// 获取为显示进行格式化的单元格的值。
213            /// </summary>

214            public string FormattedValue
215            {
216                set { _FormattedValue = value; }
217                get { return _FormattedValue; }