2

好吧,所以我一直在环顾四周(在 SO 和 Google 上),看看一个问题是否可以解决我的错误,但显然不能,所以这里是:

我正在尝试打印有时会超过一页的内容,并且正在检查要打印的页数。在检查了所有这些逻辑之后,我使用该HasMorePages属性来设置是否有另一个页面。这是我的代码:

int currentpage = 0;
int pagesleft = 0;
private void doc_PrintPage(object sender, PrintPageEventArgs ev)
{
    ev.Graphics.Clear(Color.White);
    int numofpages = (int)Math.Ceiling((double)(numofwords / 29.0));
    numofpages = (int)Math.Ceiling((double)(numofwords / 29.0));
    currentpage = currentpage + 1;
    if(currentpage == 1)
    {
        pagesleft = numofpages;
    }
    if (numofwordsleft >= 29)
    {
        currentwords = 29;
    }
    else
    {
        currentwords = numofwordsleft;
    }
    Font f19 = new Font("Arial", (float)19);
    Font f9 = new Font("Arial", (float)9);            

    ev.Graphics.DrawString("Pages: "+numofpages.ToString()+"         Words: "+numofwords.ToString()+"     "+currentwords.ToString(), f19, Brushes.Red, 200, 300);
    ev.Graphics.DrawString("Words Left: "+numofwordsleft, f19, Brushes.Green, 200, 500);

    ev.Graphics.DrawString("Pages: "+numofpages.ToString()+"       Current Page: "+currentpage.ToString(), f19, Brushes.Blue, 200, 700);

    numofwordsleft = numofwordsleft - currentwords;
    pagesleft = pagesleft - 1;

    //currentpage++;
    //if (currentpage != numofpages && currentpage < numofpages && pagesleft > 0 && pagesleft != 0)
    if(currentpage < numofpages)
    {
        ev.HasMorePages = true;
    }
    else 
    {
        ev.HasMorePages = false;
    }
}

现在一切正常,但是当我尝试打印多页时,它会打印 2 页。我做了一些调试,发现了这个:

在此处输入图像描述

所以HasMorePages等于false所以它应该只打印一页。我按下了继续调试,它在最后再次到达断点。因为我一开始就清除了页面,所以我只看到了第二页(在 a 中printpreview),但是printpreview说只有一页,唯一显示的页面是第二页。

这是printpreview

在此处输入图像描述

对于蓝色文本,我正在这样做:

ev.Graphics.DrawString("Pages: "+numofpages.ToString()+"    Current Page: "+currenpage.ToString(), ...);

打印预览清楚地表明它在第 1 页。

对不起,很长的帖子,但我需要帮助。如果您可以帮助我/指出解决此问题的正确方向,请在此处发布。

谢谢!

编辑:所以当我尝试打印 2 页时,使用:

int numofpages = Math.Ceiling(39.0 / 29.0);

它打印 3 页,但都在同一页上,如图所示,PrintPreview除非它不能正常工作。

4

2 回答 2

1

尝试这个

    int currentpage = 0;
    int pagesleft = 0;
    int numofwordsleft = 0;
    int currentwords = 0;//For testing
    int numofwords = 120; // For testing
    private void doc_PrintPage(object sender, PrintPageEventArgs ev)
    {
        ev.Graphics.Clear(Color.White);
        int numofpages = (int)Math.Ceiling((double)(numofwords / 29.0));
        numofpages = (int)Math.Ceiling((double)(numofwords / 29.0));
        currentpage = currentpage + 1;
        if (currentpage == 1)
        {
            pagesleft = numofpages;
        }
        if (numofwordsleft >= 29)
        {
            currentwords = 29;
        }
        else
        {
            currentwords = numofwordsleft;
        }
        Font f19 = new Font("Arial", (float)19);
        Font f9 = new Font("Arial", (float)9);

        ev.Graphics.DrawString("Pages: " + numofpages.ToString() + "         Words: " + numofwords.ToString() + "     " + currentwords.ToString(), f19, Brushes.Red, 200, 300);
        ev.Graphics.DrawString("Words Left: " + numofwordsleft, f19, Brushes.Green, 200, 500);

        ev.Graphics.DrawString("Pages: " + numofpages.ToString() + "       Current Page: " + currentpage.ToString(), f19, Brushes.Blue, 200, 700);

        numofwordsleft = numofwordsleft - currentwords;
        pagesleft = pagesleft - 1;

        //currentpage++;
        //if (currentpage != numofpages && currentpage < numofpages && pagesleft > 0 && pagesleft != 0)
        if (currentpage < numofpages)
        {
            ev.HasMorePages = true;
        }
        else
        {
            ev.HasMorePages = false;
        }
    }

希望这可以帮助。这是我在更改字数后得到的预览。 打印预览屏幕截图

于 2012-06-16T23:44:44.810 回答
1

尝试以下方法:

int currentpage = 0;
private void doc_PrintPage(object sender, PrintPageEventArgs ev)
{
    ev.Graphics.Clear(Color.White);
    int numofpages = (int)Math.Ceiling((double)(numofwords / 29.0));
    currentpage++;
    // Print some graphics onto ev.Graphics
    ev.HasMorePages = (currentpage < numofpages)
}

不要忘记包括 currentpage=0; 在开始新的打印之前!

更新:

您的打印通过单击按钮或菜单项单击或其他方式开始。假设您使用一个按钮,预期(至少)是这样的:

private void cmdStartPrint_Click(object sender, System.EventArgs e)
{
    currentpage = 0;
    PrintDocument pd = new PrintDocument();
    pd.PrintPage  += new PrintPageEventHandler(this.doc_PrintPage);
    pd.Print();
}

还有一个提示:处理一次性的(包括 pd)

于 2012-06-16T23:26:44.690 回答