日期:2014-05-17  浏览次数:20889 次

跪求C#用毫米表示DataGridView高度的方法
在C#编程打印表格内容时,由于DataGridView表格各行的高度可能不一致,所以要用一个行高计数器累加当前行高的数值,然后与纸张高度作比较以计算总页数,我想用以下代码来计算当前累计行高:

/*假定:
  prtDoc为printdocument对象;
  标题及表头与表脚每页占用的高度为fixedH(像素值);
  纸张页边距以内高度为e.MarginBounds.Height(百分之一英寸);
  每页可留给表格主体的打印空间高度为prtH=e.MarginBounds.Height-fixedH;[两个值的单位不统一]
*/
private void prtDoc_PrintPage( object sender, PrintPageEventArgs e )//在打印事件中写的代码
 {
       int countH=0;行高统计

       int sumPg=1;//页数统计

        foreach (DataGridViewRow r in prtdgv.Rows) //prtdgv是一个DataGridView对象
       {
             if( r.IsNewRow || !r.Selected ) { Continue;}
             countH += r.Height;
             if(countH>prtH)//比较表体与可打印区高度,这里两个值的单位不统一
            {
                  sumPg++;//若高度超出可打印高度,则页数递增
                  countH=r.Height;//复位计数器,当前行高因超出打印范围,故累加到下页
             }
       }
}
    上述代码的问题是:DataGridView行高以及用e.MeasureString方法得到的字符高度均以像素
来表示的,而纸张的边距、可打印区域的数值是以百分之一英寸表示的,这是C#的规则,如果想在打印之前先算出所需总页数,就必须把像素值和百分之一英寸这两个单位统一起来,这就是问题的关键。
    我试过在这个事件中用e.Graphics.PageUnit = GraphicsUnit.Millimeter;来统一单位,但页面单位及表格高度的单位系统并未自动转换为Millimeter;
    希望各位知情者给予解答。这样我就能事先算出有多少页,在每页的页脚打印这样的页码:[第?页,共?页]。
    我当前可用分只有180,用详细代码解答者,我全部奉送! 望不吝赐教,先行谢过!
       

------解决方案--------------------
要不LZ用水晶报表吧,要打印的时候报表自己计算高度
------解决方案--------------------
LZ用printDocument打印表格挺麻烦的,光是计算文字之间的间距什么就够麻烦了,最好还是用水晶报表,这个很简单,做好报表,打印的时候用表格填充一下报表就可以打印了
------解决方案--------------------
引用:
谢谢各位热心肠哈,但是作为编程学习者,我希望能把问题搞清楚,这个像素值与可计量单位之间的转换问题我查过网上很多答案,有一种方法应该可行,可是我没搞懂,没看到详细代码,大致思路是:

1、用API函数获得设备句柄(指针)
2、用API函数获得设备分辨率
3、根据水平与垂直方向分辨率分别对宽、高进行换算,这样就可以统一坐标数据的计量单位
4、用e.Graphics.PageUnit来指定打印时的计量单位为换算后统一的单位

我不知道为什么要这样做,也不知道这个办法的具体代码如何写,我不知道为什么用e.Graphics.DpiX/Y来做换算参数为什么得到的打印结果相差甚远,好象没人愿意涉及这个问题,大家都在回避回答这样的问题,我刚学,是真的不懂,也许是因为这个问题很SB,没人愿意回答吧。