C#PrintDocument:用于计算总页数的幻像打印

时间:2014-01-23 23:19:09

标签: c# printing datagridview

我目前有一个能够使用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;
    }
}

2 个答案:

答案 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());