//定义全局变量count,储存当前打印的行数 int count=0; //定义一个方法,接收一个DataTable类型参数及PrintDocument的PrintPage事件传入的参数e以方便操作 private voidPrintTable(DataTable dt, System.Drawing.Printing.PrintPageEventArgse) { //取得对应的Graphics对象 Graphicsg = e.Graphics; //获得相关页面X坐标、Y坐标、打印区域宽度、长度 intx = e.PageSettings.Margins.Left; inty = e.PageSettings.Margins.Top; intwidth = e.PageSettings.PaperSize.Width -e.PageSettings.Margins.Left- e.PageSettings.Margins.Right; intheight = e.PageSettings.PaperSize.Height -e.PageSettings.Margins.Top -e.PageSettings.Margins.Bottom; //定义打印字体 Fontfont = new Font("宋体",15); //rowCount是除去打印过的行数后剩下的行数 introwCount = dt.Rows.Count-count; //maxPageRow是当前设置下该页面可以打印的最大行数 intmaxPageRow=height/(int)font.GetHeight(); //因为是表格,先画一条水平直线 g.DrawLine(newPen(Brushes.Black, 1), new Point(x, y), new Point(x +(dt.Columns.Count) * 135, y)); //再画出表格各列的列标题 for(int i = 0; i < dt.Columns.Count; i++) { stringhead = dt.Columns[i].ColumnName; g.DrawString(head,font, Brushes.Black, x + i * 135, y); } //画完标题,再画一条直线 g.DrawLine(newPen(Brushes.Black, 1), new Point(x, y + (int)font.GetHeight()), newPoint(x + (dt.Columns.Count) * 135, y +(int)font.GetHeight())); //判断,如果剩下的行数小于可打印的最大行数,则执行下列代码 if(maxPageRow >=rowCount) { //当前行数小于Table内总行数时,循环 while(count < dt.Rows.Count) { //内循环打印Table内行数据 intcolumnCount = 0; while(columnCount < dt.Columns.Count) { stringtemp = dt.Rows[count][columnCount].ToString(); //打印每个单元格内的数据 g.DrawString(temp,font, Brushes.Black, x + columnCount * 135, y + (count %maxPageRow) * (int)font.GetHeight() +(int)font.GetHeight()); //打印完一行后,继续打印一条直线 g.DrawLine(newPen(Brushes.Black, 1), new Point(x, y + (count % maxPageRow) *(int)font.GetHeight() + 2 * (int)font.GetHeight()), new Point(x +(dt.Columns.Count) * 135, y + (count % maxPageRow) *(int)font.GetHeight() + 2 * (int)font.GetHeight())); columnCount++; } count++; } //所有数据打印完毕后,打印垂直直线 for (int i = 0; i <= dt.Columns.Count; i++) { g.DrawLine(newPen(Brushes.Black), new Point(x + i * 135, y), new Point(x + i *135, y + rowCount * (int)font.GetHeight() +(int)font.GetHeight())); } } //判断,如果剩下的行数大于可打印的最大行数,则执行下列代码 else { do { //与上面类似,注意下面while的条件 intcolumnCount = 0; while(columnCount < dt.Columns.Count) { stringtemp = dt.Rows[count][columnCount].ToString(); //打印每个单元格 g.DrawString(temp,font, Brushes.Black, x + columnCount * 135, y + (count %maxPageRow) * (int)font.GetHeight() +(int)font.GetHeight()); //打印水平直线 g.DrawLine(newPen(Brushes.Black, 1), new Point(x, y + (count % maxPageRow) *(int)font.GetHeight() + 2 * (int)font.GetHeight()), new Point(x +(dt.Columns.Count)*135, y + (count % maxPageRow) *(int)font.GetHeight() + 2 * (int)font.GetHeight())); columnCount++; } count++; }while ((count % maxPageRow >0)); //打印垂直直线 for(int i = 0; i <= dt.Columns.Count;i++ ) { g.DrawLine(newPen(Brushes.Black), new Point(x + i * 135, y), new Point(x + i *135, y + height + (int)font.GetHeight())); } } //指定HasMorePages值,如果页面最大行数小于剩下的行数,则返回true(还有),否则返回false if(maxPageRow<rowCount) { e.HasMorePages= true; } else { e.HasMorePages= false; count= 0; } } |