打印文档HasMorePages don';不起作用

本文关键字:不起作用 don 文档 HasMorePages 打印 | 更新日期: 2023-09-27 17:57:28

我想打印数据网格中的数据。代码在第一页运行良好,但注释行运行不好,无法移动到下一页。有人能帮忙解决这个问题吗?

private void DrawFactorA4(object sender, PrintPageEventArgs ev)
    {
     for (int j = 0; j < GrdRDocument.Rows.Count; j++)
        {
            i += 2;
            //draw data grid
            s++;
            if(s == 10)
            {    
               //ev.HasMorePages = true;  //this line doesn't work
               s = 0;
               i = 0;                 
            }
            else
            {
               ev.HasMorePages = false;                    
            }
        }
    }

_

private void BtnPrint_Click(object sender, EventArgs e)
    {
        printFont = new Font("Arial", 12);
        IEnumerable<PaperSize> paperSizes = 
        pd.PrinterSettings.PaperSizes.Cast<PaperSize>();
        sizeA4 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A4);
        pd.DefaultPageSettings.Landscape = true;
        pd.DefaultPageSettings.PaperSize = sizeA4;
        pd.PrintPage += new PrintPageEventHandler(this.DrawFactorA4);
        printPreviewDialog.Document = pd;
        printPreviewDialog.ShowDialog();
    }

打印文档HasMorePages don';不起作用

停止并阅读您所拥有的:

printFont = new Font("Arial", 12);

字体是未经管理的资源;在这里,你实例化了一个,却从不处理它。也许在这种特殊的情况下这是无害的,但这是一个坏习惯。

pd.PrintPage += new PrintPageEventHandler(this.DrawFactorA4);

将为文档中的每一页调用DrawFactorA4。内部DrawFactorA4:

for (int j = 0; j < GrdRDocument.Rows.Count; j++)

无论行数或页面大小如何,都可以遍历GrdRDocument中的每个Row。这是错误的;页面填满后你必须停下来。顺便说一句,我希望GrdRDocument是不可变数据的本地副本,而不是将UI控件传递给打印线程。

s++;
if(s == 10)
{    
    //ev.HasMorePages = true;  //this line doesn't work
    s = 0;

您的评论行可以正常工作。问题是您设置了ev.HasMorePages = true,然后忽略它;设置s = 0并不断迭代;下一次迭代s=10所以你:

    ev.HasMorePages = false;

阅读PrintDocument文档;它有一个打印多页的例子。您应该创建一个类来存储所有非托管资源和页面状态。把它设为IDisposable,这样他们就可以被处理掉了。只遍历每一页上要打印的行或任何内容。类似于:

class PrintStuff : IDisposable
{
    readonly IEnumerable<Whatever> data;
    readonly PrintDocument pd;
    Font font;
    private int currentIndex;
    public PrintStuff(IEnumerable<Whatever> data)
    {
        this.data = data;
        pd = new PrintDocument();
        pd.BeginPrint += OnBeginPrint;
        pd.PrintPage += OnPrintPage;
        pd.EndPrint += OnEndPrint;
    }
    public void Print()
    {
        pd.Print();
    }
    public void Dispose()
    {
        pd.Dispose();
    }
    private void OnBeginPrint(object sender, PrintEventArgs args)
    {
        font = new Font(FontFamily.GenericSansSerif, 12F);
        currentIndex = 0;
    }
    private void OnEndPrint(object sender, PrintEventArgs args)
    {
        font.Dispose();
    }
    private void OnPrintPage(object sender, PrintPageEventArgs args)
    {
        var x = Convert.ToSingle(args.MarginBounds.Left);
        var y = Convert.ToSingle(args.MarginBounds.Top);
        var lineHeight = font.GetHeight(args.Graphics);
        while ((currentIndex < data.Count())
               && (y <= args.MarginBounds.Bottom))
        {
            args.Graphics.DrawWhatever(data.ElementAt(currentIndex), font, Brushes.Black, x, y);
            y += lineHeight;
            currentIndex++;
        }
        args.HasMorePages = currentIndex < data.Count();
    }
}