当前位置:编程学习 > C#/ASP.NET >>

打印datagridvew 为什么总重复打第一页,好象没有停下来的时候,

首先是一个类:
namespace schoolInformation
 {
     public class Printer
     {
         private DataGridView dataview;
         private PrintDocument printDoc;
         //打印有效区域的宽度   
         int width;
         int height;
         int columns;
         double Rate;
         bool hasMorePage = false;
         int currRow = 0;
         int rowHeight = 20;
         //打印页数   
         int PageNumber;
         //当前打印页的行数   
         int pageSize = 20;
         //当前打印的页码   
         int PageIndex;

         private int PageWidth;
         private int PageHeight; 
         private int LeftMargin;   
         private int TopMargin;//  
         private int RightMargin;//   
         private int BottomMargin;// 

         int rows;
       public Printer(DataGridView dataview, PrintDocument printDoc)
         {
             
             this.dataview = dataview;
             this.printDoc = printDoc;
             PageIndex = 0;
             //获取打印数据的具体行数   
             this.rows = dataview.RowCount;

             this.columns = dataview.ColumnCount;
            
             if (!printDoc.DefaultPageSettings.Landscape)
             {

                 PageWidth = printDoc.DefaultPageSettings.PaperSize.Width;
                 PageHeight = printDoc.DefaultPageSettings.PaperSize.Height;

             }
             else
             {
                 PageHeight = printDoc.DefaultPageSettings.PaperSize.Width;
                 PageWidth = printDoc.DefaultPageSettings.PaperSize.Height;

             }
             LeftMargin = printDoc.DefaultPageSettings.Margins.Left;
             TopMargin = printDoc.DefaultPageSettings.Margins.Top;//上面有装订线
            RightMargin = printDoc.DefaultPageSettings.Margins.Right;
             BottomMargin = printDoc.DefaultPageSettings.Margins.Bottom;


             height = PageHeight - TopMargin - BottomMargin - 2;
             width = PageWidth - LeftMargin - RightMargin - 2;

             double tempheight = height;
             double temprowHeight = rowHeight;
             while (true)
             {
                 string temp = Convert.ToString(tempheight / Math.Round(temprowHeight, 3));
                 int i = temp.IndexOf('.');
                 double tt = 100;
                 if (i != -1)
                 {
                     tt = Math.Round(Convert.ToDouble(temp.Substring(temp.IndexOf('.'))), 3);
                 }
                 if (tt <= 0.01)
                 {
                     rowHeight = Convert.ToInt32(temprowHeight);
                     break;
                 }
                 else
                 {
                     temprowHeight = temprowHeight + 0.01;

                 }
             }
             pageSize = height / rowHeight;
             if ((rows + 1) <= pageSize)
             {
                 pageSize = rows + 1;
                 PageNumber = 1;
             }
             else
             {
                 PageNumber = rows / (pageSize - 1);
                 if (rows % (pageSize - 1) != 0)
                 {
                     PageNumber = PageNumber + 1;
                 }

             }


         }


         public  bool InitPrint()
         {

             PageIndex = PageIndex + 1;
             MessageBox.Show(PageIndex.ToString());
             if (PageIndex == PageNumber)
             {
                 hasMorePage = false;
                 if (PageIndex != 1)
                 {
                     pageSize = rows % (pageSize - 1) + 1;
                 }
             }
             else
             {
                 hasMorePage = true;
             }

             return hasMorePage;

         }
         //打印头   
         private void DrawHeader(Graphics g)
         {

             Font font = new Font("宋体", 11, FontStyle.Bold);
             int temptop = (rowHeight / 2) + TopMargin + 1;
             int templeft = LeftMargin + 1;

             for (int i = 0; i < this.columns; i++)
             {
                 string headString = this.dataview.Columns[i].HeaderText;

                 float fontHeight = g.MeasureString(headString, font).Height;
                 float fontwidth = g.MeasureString(headString, font).Width;
                 float temp = temptop - (fontHeight) / 3;
                 g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));
                 templeft = templeft + (int)(this.dataview.Columns[i].Width / Rate) + 1;
             }

         }
         //画表格   
         private void DrawTable(Graphics g)
         {

             Rectangle border = new Rectangle(LeftMargin, TopMargin, width, (pageSize) * rowHeight);
             g.DrawRectangle(new Pen(Brushes.Black, 2), border);
             for (int i = 1; i < pageSize; i++)
             {
                 if (i != 1)
                 {
                     g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));
                 }
                 else
                 {
                     g.DrawLine(new Pen(Brushes.Black, 2), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));
                 }
             }

             //计算出列的总宽度和打印纸比率   
             Rate = Convert.ToDouble(GetDateViewWidth()) / Convert.ToDouble(width);
             int tempLeft = LeftMargin + 1;
             int endY = (pageSize) * rowHeight + TopMargin;
             for (int i = 1; i < columns; i++)
             {
                 tempLeft = tempLeft + 1 + (int)(this.dataview.Columns[i - 1].Width / Rate);
                 g.DrawLine(new Pen(Brushes.Black, 1), new Point(tempLeft, TopMargin), new Point(tempLeft, endY));
             }

         }
         
         /// 获取打印的列的总宽度   
         
         private int GetDateViewWidth()
         {
             int total = 0;
             for (int i = 0; i < this.columns; i++)
             {
                 total = total + this.dataview.Columns[i].Width;
             }
             return total;
         }

         //打印行数据   
         private void DrawRows(Graphics g)
         {

             Font font = new Font("宋体", 11, FontStyle.Regular);
             int temptop = (rowHeight / 2) + TopMargin + 1 + rowHeight;

             try
             {
                 for (int i = currRow; i < pageSize + currRow - 1; i++)
                 {
                     int templeft = LeftMargin + 1;
                     for (int j = 0; j < columns; j++)
                     {

                         string headString = this.dataview.Rows[i].Cells[j].Value.ToString();

                         float fontHeight = g.MeasureString(headString, font).Height;
                         float fontwidth = g.MeasureString(headString, font).Width;

                         float temp = temptop - (fontHeight) / 3;
                         while (true)
                         {
                             if (fontwidth <= (int)(this.dataview.Columns[j].Width / Rate))
                             {
                                 break;
                             }
                             else
                             {
                                 headString = headString.Substring(0, headString.Length - 1);
                                 fontwidth = g.MeasureString(headString, font).Width;
                             }
                         }
                         g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));

                         templeft = templeft + (int)(this.dataview.Columns[j].Width / Rate) + 1;
                     }

                     temptop = temptop + rowHeight;


                 }
                 currRow = pageSize + currRow - 1;
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message,"数据错误!",MessageBoxButtons.OK,MessageBoxIcon.Error);
             }

         }

       
         /// 在PrintDocument中的PrintPage方法中调用   
        
         /// <param name="g">传入PrintPage中PrintPageEventArgs中的Graphics</param>   
         /// <returns>是否还有打印页 有返回true,无则返回false</returns>   
         public bool Print(Graphics g,string title)
         {
             InitPrint();
             DrawTable(g);
             DrawHeader(g);
             DrawRows(g);



             //打印页码   
             string pagestr = PageIndex + " / " + PageNumber;
             Font font = new Font("宋体", 10, FontStyle.Regular);//页脚字体
            Font font2 = new Font("黑体", 16, FontStyle.Regular);//标题字体
            g.DrawString(pagestr, font, Brushes.Black, new PointF((PageWidth / 2) - g.MeasureString(pagestr, font).Width, PageHeight - (BottomMargin / 2) - g.MeasureString(pagestr, font).Height));
             //打印查询的功能项名称   
             //    string temp = dataview.Tag.ToString() + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm");
             //  string temp = "班级学生成绩";
             string temp = title;
             g.DrawString(temp, font2, Brushes.Black, new PointF(PageWidth / 2 + 15 - g.MeasureString(temp, font).Width, 70));//这是标题
            g.DrawString(temp, font, Brushes.Black, new PointF(PageWidth - 5 - g.MeasureString(temp, font).Width, PageHeight - 5 - g.MeasureString(temp, font).Height));//这是在页脚
            return hasMorePage;
             
         }
     }
 }



其次是 _PrintPage:

         private void printDocument_score_PrintPage(object sender, PrintPageEventArgs e)
         {
             //设置 打印内容
            Graphics g = e.Graphics;
             string className = this.className.Text;
             string terme = this.label_termeName.Text;
             string course = this.courseName.Text;
             string title = className + terme + course + "期末成绩";
             Printer p = new Printer(dataGridView_score, printDocument_score);

           e.HasMorePages = p.Print(g, title);
       }


结果:只能打印每一页,不能打印第二页,请高手帮忙,我用的是c# 

请大师帮一下,能给一个代码更感谢了。
--------------------编程问答-------------------- 我只想说,你前面发 的一个帖子白发了,,

说了那么多你还不明白,

        //获取打印数据的具体行数   
        this.rows = dataview.RowCount;

你的DataGridView分页了,这里获取的始终是第一页的rowCount所以打的始终是第一页的,你自己调试下就知道了,
你那打印写的太复杂了,直接用水晶报表很方便
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,