2011-11-06 42 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