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;
}
}
因为如果你在打印页面中有这个方法,每次打印一个新页面时你都会再次读取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;
}
}