печать richtextbox на c#

#c#

Вопрос:

У меня есть диалоговое окно 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;
   }
}
 

Ответ №1:

Потому что, если у вас есть этот метод даже на странице печати, каждый раз, когда печатается новая страница, вы снова читаете содержимое окна 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;
       }
   }