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ので、1ページだけを印刷する必要があります。デバッグの続行を押すと、最後にブレークポイントに再びヒットしました。最初にページをクリアしたので、2ページ目(のprintpreviewprintpreviewしか表示されていませんでしたが、1ページしかなく、表示されていたのは2ページ目だけだったとのことです。

これがprintpreview

ここに画像の説明を入力してください

青いテキストの場合、私はこれを行っています:

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

そして、印刷プレビューはそれがページ1にあることをはっきりと示しています。

長い投稿で申し訳ありませんが、助けが必要です。あなたが私を助けて/これを解決するための正しい方向に私を向けることができるならば、ここに投稿してください。

ありがとう!

編集:それで、私が2ページを印刷しようとすると、以下を使用します。

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

PrintPreview3ページを印刷しますが、正しく機能しない場合を除いて、すべて同じページに表示されます。

4

2 に答える 2

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 に答える
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 に答える