none
C#打印,如何计算DataGridView打印所需的总页数? RRS feed

  • 问题

  • 在打印表格内容时,由于DataGridView表格各行的高度可能不一致,所以要用一个行高计数器累加当前行高的数值,然后与纸张高度作比较以判断是否要分页,我的计算页数的代码如下:

    //prtDoc为printdocument对象

    private void prtDoc_PrintPage( object sender, PrintPageEventArgs e )

     {

           int countH=0;行高统计

           int sumPg=1;//页数统计

            foreach (DataGridViewRow r in prtdgv.Rows) //prtdgv是一个DataGridView对象
           {
                 countH += r.Height;

                 if(countH>e.MarginBounds.Height)

                {

                      sumPg++;//当前页累计行高超出可打印高度则页数加1

                      countH=r.Height;//因当前行高已超出页面,需打印到下页,故行高计数器赋值为当前行高进入下页的累计高度

                 }

           }

    }

                         问题提出:

          以上代码遇到了“计量单位不统一”的问题,因e.MarginBounds.Height这个高度的单位是百分之一英寸,而countH(行高)的单位是像素;所以用以上代码计算出来的页数不正确,也就是说在该分页的地方未分页,在不该分页的地方却分页了,导致整个页面定位不准确,很混乱。需要比较页宽的时候也会遇到相同的问题。因表格的列宽也是用像素来表示的而不是百分之一英寸。

    为了解决上述问题:

    我试过在这个事件中用e.Graphics.PageUnit = GraphicsUnit.Millimeter;之类的语句来统一单位,未果!

    也试过用以下语句来获取设备分辨率企图换算为统一单位表示的高度,未果!

                        int pX=0;

                         int pY=0;

                        using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
                       {
                            if (Environment.OSVersion.Version.Major >= 6)
                            {
                                SetProcessDPIAware();
                            }
                            pX = g.DpiX;
                            pY = g.DpiY;
                        }

                      或pX=e.Graphics.DpiX;pY=e.Graphics.DpiY;算出来也不行!

    这个问题纠结很久很久了,就像一座山阻挡了我继续学习的步伐,我无法越过,请高手指教,先行谢过!!!

    凡是提供相关国外网站连接的请绕过,请不辞辛苦用详细的示例代码来指导,再次感谢!


    LJH


    • 已编辑 SZLJH 2013年12月3日 1:27
    2013年12月3日 1:25