[英]printing richtextbox in 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;
}
}
因為即使在打印頁面中也使用此方法,所以每次打印新頁面時,您都會再次讀取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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.