计算将从DataGridView打印的总页数

时间:2013-09-03 16:16:34

标签: 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 < 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));

1 个答案:

答案 0 :(得分:0)

起初我以为你实际上会有超过必要的页数,因为你在计算中包含第一页的Column [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的额外“间隙”每页不可用。

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