2012-06-16 27 views
2

好了,所以我一直在尋找周圍(在SO和谷歌),看是否有問題可以解決我的錯誤,但顯然不是,所以這裏有雲:印刷HasMorePages的工作不C#

我想打印的東西,有時會有多個頁面,我正在檢查要打印的頁面數量。在檢查了所有這些邏輯之後,我使用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頁。我做了一些調試,發現這個:

enter image description here

所以HasMorePages等於false所以應該只打印1頁。我按下繼續調試,並在最後再次觸發斷點。由於我在開始時清除了頁面,因此我只看到第二頁(在printpreview中),但printpreview表示只有1頁,而唯一顯示的頁面是第二頁。

這裏是printpreview

enter image description here

對於藍色文字我這樣做:

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

和打印預覽清楚地說,這是第1頁上

對不起,很長的文章,但我需要幫助。如果你能幫助我/指出我解決這個問題的正確方向,請在這裏發帖。

謝謝!

編輯:所以,當我嘗試打印2頁,使用:

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

它打印3頁,但都在同一頁上,如圖PrintPreview除非這是不正常。

+0

使用BeginPrint事件重置頁計數器。 –

回答

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; 
     } 
    } 

希望這有助於。 這是我在更改單詞數後獲得的預覽。 Print Preview Screen Shot

+0

我會盡快嘗試,謝謝! – 3aw5TZetdf

+0

我試過這個,但得到了相同的結果,打印2個頁面1. – 3aw5TZetdf

+0

你可以粘貼這裏完整的Graphics.DrawString行,我需要檢查代碼。 – MMK

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) 
} 

不要忘了,包括當前頁= 0;在開始新的打印之前!

UPDATE:

您的打印通過點擊一個按鈕或菜單項上點擊或什麼的開始。假設你使用一個按鈕,有什麼預期(爲最低)是這樣的:

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)

+0

我會盡快試用,謝謝! – 3aw5TZetdf

+0

我試過了,但得到了與我的文章相同的結果。 – 3aw5TZetdf

+0

它適用於我。可能你做的比你問題中提出的代碼更多,可能會改變預期的行爲或它。向我們展示您的完整代碼會更有幫助。 – 2012-06-17 08:56:58