printing richtextbox in c#

本文关键字:in richtextbox printing | 更新日期: 2023-09-27 18:13:35

我有richtextbox和预览对话框。当我想做一个预览,我想看到所有的页面的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;
   }
}

printing richtextbox in c#

因为如果你在打印页面中有这个方法,每次打印一个新页面时你都会再次读取RichTextBox的内容:

lines = rtb.Text.Split(param);

你又从头开始了…

所以你必须阅读RichTextBox的内容只有在第一页…为了解决这个问题,你可以在方法外声明一个变量:

private int printPage = 0 ;

并从方法中外部化变量:

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

新代码变成(我还没有测试过——只是一个概念证明):

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