2011-11-06 62 views
1

我有richtextbox和預覽對話框。 當我想進行預覽時,我想查看richtextbox的所有頁面,但現在我只能多次看到第一個頁面。在c中打印richtextbox#

請幫我

char[] param = { '\n' }; 
string [] lines = {}; 

if (pd.PrinterSettings.PrintRange == PrintRange.Selection) 
{ 
    lines = rtb.SelectedText.Split(param); 
} 
else 
{ 
    lines = rtb.Text.Split(param); 
} 

int i = 0; 
char[] trimParam = { '\r' }; 
foreach (string s in lines) 
{ 
    lines[i++] = s.TrimEnd(trimParam); 
} 
int linesPrinted = 0; 
int x = e.MarginBounds.Left; 
int y = e.MarginBounds.Top; 
Brush brush = new SolidBrush(rtb.ForeColor); 

while (linesPrinted < lines.Length) 
{ 
    e.Graphics.DrawString(lines[linesPrinted++], 
     rtb.Font, brush, x, y); 
    y += 15; 
    if (y >= e.MarginBounds.Bottom) 
    { 
     e.HasMorePages = true; 
     return; 
    } 
    else 
    { 

     e.HasMorePages = false; 
    } 
} 

回答

0

因爲如果你擁有的每一個新的頁面打印你再次讀取RichTextBox中的內容時,在打印頁面這種方法甚至,:

lines = rtb.Text.Split(param); 

而你又從頭開始......

所以你必須閱讀RichTextBox的內容只在第一頁... 要解決這個問題你例如可以聲明的方法的可變外:

private int printPage = 0 ; 

而且從方法外部化變量:

string [] lines = {}; 
int linesPrinted = 0; 

成爲新的代碼(I沒有測試它 - 僅是證明概念):

if(printPage <= 0) { 
    //First Page 
    char[] param = { '\n' }; 
    linesPrinted = 0; 
    if (pd.PrinterSettings.PrintRange == PrintRange.Selection) 
    { 
     lines = rtb.SelectedText.Split(param); 
    } 
    else 
    { 
     lines = rtb.Text.Split(param); 
    } 
    } 
    int i = 0; 
    char[] trimParam = { '\r' }; 
    foreach (string s in lines) 
    { 
     lines[i++] = s.TrimEnd(trimParam); 
    } 

    int x = e.MarginBounds.Left; 
    int y = e.MarginBounds.Top; 
    Brush brush = new SolidBrush(rtb.ForeColor); 

    while (linesPrinted < lines.Length) 
    { 
     e.Graphics.DrawString(lines[linesPrinted++], 
      rtb.Font, brush, x, y); 
     y += 15; 
     if (y >= e.MarginBounds.Bottom) 
     { 
      e.HasMorePages = true; 
      printPage++; 
      return; 
     } 
     else 
     { 
      e.HasMorePages = false; 
     } 
    } 
+0

我應該在代碼中完全改變什麼? –

+0

我發表了一個例子。 – aleroot