C# 计算将从DataGridView打印的总页数

C# 计算将从DataGridView打印的总页数,c#,math,printing,datagridview,C#,Math,Printing,Datagridview,我试图计算从DataGridView打印的总页数。 一旦总列长大于总打印面积,将打印新页。 对于每个新页面,它将始终打印第0列,以便需要添加列宽以获得正确的计算结果 这是我到目前为止一直没有找到页码的地方 //dgv = the DataGridView //RectangleF printable_area = MarginBounds float total_width = 0; //grab the width of each column for (int i = 0; i <

我试图计算从DataGridView打印的总页数。 一旦总列长大于总打印面积,将打印新页。 对于每个新页面,它将始终打印第0列,以便需要添加列宽以获得正确的计算结果

这是我到目前为止一直没有找到页码的地方

//dgv = the DataGridView
//RectangleF printable_area = MarginBounds

float total_width = 0;

//grab the width of each column
for (int i = 0; i < dgv.ColumnCount; i++)
{
    total_width += dgv.Columns[i].HeaderCell.Size.Width;
}
//divide the total width by the printable area's width
int pages = (int)Math.Ceiling(total_width / (printable_area.Size.Width));

//add to the total width the size of column 0 * the number of pages
total_width += dgv.Rows[0].Cells[0].Size.Width * pages;

//return the total number of pages that will be printed
return (int)Math.Ceiling(total_width / (printable_area.Size.Width));
//dgv=数据网格视图
//矩形F可打印面积=边缘边界
浮动总宽度=0;
//抓取每列的宽度
对于(int i=0;i
起初,我以为您实际拥有的页面会比需要的多,因为您在计算中包含了第一页的列[0]两次(我认为变量
I
应该从1开始),但后来我意识到这个计算

int pages = (int)Math.Ceiling(total_width / (printable_area.Size.Width));
将假定列可以分布在页面上

假设有4列,每列的宽度为100。现在假设您的可打印区域宽度为150。忽略在每页上打印第一列的要求,这将为您提供3页,因为400/150为2.67,四舍五入为3。然而,您实际需要的是4页,因为一页上永远无法容纳两列,并且每页无法使用宽度为50的额外“间隙”


这是假设您不想在每页上打印半个或部分列。如果这是您的意图,那么我看不出您的代码有任何进一步的错误

我切换到PageBounds,只是在需要的地方进行了调整,现在它工作正常。我仔细阅读了上面的代码,并将其写在纸上,调整后的计算是正确的,因此第1页中没有两次添加列[0]。