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