我目前有一个能够使用System.Drawing.Printing.PrintDocument将DataGridView打印到页面上的功能 - 打印实用程序在我的打印页面功能(PrintDoc_PagePrint)中运行,直到它用完行(它将设置为行) HasMorePages为false。)
我正在尝试计算打印前的总页数,这样我就可以在每页的底部放置“y页x”。一种方法是计算每页上适合的行数,并根据总共有多少行计算出有多少页,但这似乎不是很通用,因为它依赖于每一行的高度相同,根据它的编程方式,可能并非总是如此。
我想要的方法是进行“幻像”打印 - 或者基本上在后台打印到空打印机而无需用户知道。当它执行第一次打印时,它可以在每次运行打印功能时递增全局变量TotalPages,然后一旦完成幻像打印,停止TotalPages在下次打印时递增(可能只是通过设置一个bool一旦幻像打印是完成。)这将更加通用,适用于具有不同行高的数据网格,或者我想要打印的任何其他类型的数据。
我的问题是 - 有没有办法在后台运行样本打印?这是在用户选择页面大小和方向等之后完成的,因此我们确实知道这些基本细节,但是在显示打印预览对话框之前。
这是我的一些代码...它有点有用,但由于某些原因它不能一直有效!
// Phantom print to determine number of pages. Writes to TotalPages var.
// The next print won't write to TotalPages when FirstPreviewDone is set to true.
var printEventArgs = new PrintEventArgs();
// Create a graphics object of the page size to "print" to.
int x = 0;
int y = 0;
int width = printDoc.DefaultPageSettings.PaperSize.Width;
int height = printDoc.DefaultPageSettings.PaperSize.Height;
Rectangle marginBoundsRectangle = new Rectangle(x, y, width, height);
Rectangle pageBoundsRectangle = new Rectangle(0, 0, printDoc.DefaultPageSettings.PaperSize.Width, printDoc.DefaultPageSettings.PaperSize.Height);
Bitmap b = new Bitmap(width, height);
// Swap everything if it's in landscape.
if (printDoc.DefaultPageSettings.Landscape)
{
marginBoundsRectangle = new Rectangle(y, x, height, width);
pageBoundsRectangle = new Rectangle(0, 0, printDoc.DefaultPageSettings.PaperSize.Height, printDoc.DefaultPageSettings.PaperSize.Width);
b = new Bitmap(height, width);
}
Graphics graphics = Graphics.FromImage(b);
var printPageEventArgs = new PrintPageEventArgs(graphics, marginBoundsRectangle, pageBoundsRectangle, printDoc.DefaultPageSettings);
printPageEventArgs.HasMorePages = true;
PrintDoc_BeginPrint(null, printEventArgs);
while (printPageEventArgs.HasMorePages && !printPageEventArgs.Cancel)
{
try
{
PrintDoc_PrintPage(null, printPageEventArgs);
}
catch (Exception ex)
{
MessageBoxEx.Show(ex.Message, "Error printing - Check logs", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
答案 0 :(得分:1)
以下问题已经回答了这个问题......
Is there a better way to get the page count from a PrintDocument than this?
希望这会有所帮助......
答案 1 :(得分:0)
int iPageCount = rptDocument.FormatEngine.GetLastPageNumber(new ReportPageRequestContext());