打印文档HasMorePages don';不起作用
本文关键字:不起作用 don 文档 HasMorePages 打印 | 更新日期: 2023-09-27 17:57:28
我想打印数据网格中的数据。代码在第一页运行良好,但注释行运行不好,无法移动到下一页。有人能帮忙解决这个问题吗?
private void DrawFactorA4(object sender, PrintPageEventArgs ev)
{
for (int j = 0; j < GrdRDocument.Rows.Count; j++)
{
i += 2;
//draw data grid
s++;
if(s == 10)
{
//ev.HasMorePages = true; //this line doesn't work
s = 0;
i = 0;
}
else
{
ev.HasMorePages = false;
}
}
}
_
private void BtnPrint_Click(object sender, EventArgs e)
{
printFont = new Font("Arial", 12);
IEnumerable<PaperSize> paperSizes =
pd.PrinterSettings.PaperSizes.Cast<PaperSize>();
sizeA4 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A4);
pd.DefaultPageSettings.Landscape = true;
pd.DefaultPageSettings.PaperSize = sizeA4;
pd.PrintPage += new PrintPageEventHandler(this.DrawFactorA4);
printPreviewDialog.Document = pd;
printPreviewDialog.ShowDialog();
}
停止并阅读您所拥有的:
printFont = new Font("Arial", 12);
字体是未经管理的资源;在这里,你实例化了一个,却从不处理它。也许在这种特殊的情况下这是无害的,但这是一个坏习惯。
pd.PrintPage += new PrintPageEventHandler(this.DrawFactorA4);
将为文档中的每一页调用DrawFactorA4
。内部DrawFactorA4
:
for (int j = 0; j < GrdRDocument.Rows.Count; j++)
无论行数或页面大小如何,都可以遍历GrdRDocument
中的每个Row
。这是错误的;页面填满后你必须停下来。顺便说一句,我希望GrdRDocument
是不可变数据的本地副本,而不是将UI控件传递给打印线程。
s++;
if(s == 10)
{
//ev.HasMorePages = true; //this line doesn't work
s = 0;
您的评论行可以正常工作。问题是您设置了ev.HasMorePages = true
,然后忽略它;设置s = 0
并不断迭代;下一次迭代s=10所以你:
ev.HasMorePages = false;
阅读PrintDocument
文档;它有一个打印多页的例子。您应该创建一个类来存储所有非托管资源和页面状态。把它设为IDisposable
,这样他们就可以被处理掉了。只遍历每一页上要打印的行或任何内容。类似于:
class PrintStuff : IDisposable
{
readonly IEnumerable<Whatever> data;
readonly PrintDocument pd;
Font font;
private int currentIndex;
public PrintStuff(IEnumerable<Whatever> data)
{
this.data = data;
pd = new PrintDocument();
pd.BeginPrint += OnBeginPrint;
pd.PrintPage += OnPrintPage;
pd.EndPrint += OnEndPrint;
}
public void Print()
{
pd.Print();
}
public void Dispose()
{
pd.Dispose();
}
private void OnBeginPrint(object sender, PrintEventArgs args)
{
font = new Font(FontFamily.GenericSansSerif, 12F);
currentIndex = 0;
}
private void OnEndPrint(object sender, PrintEventArgs args)
{
font.Dispose();
}
private void OnPrintPage(object sender, PrintPageEventArgs args)
{
var x = Convert.ToSingle(args.MarginBounds.Left);
var y = Convert.ToSingle(args.MarginBounds.Top);
var lineHeight = font.GetHeight(args.Graphics);
while ((currentIndex < data.Count())
&& (y <= args.MarginBounds.Bottom))
{
args.Graphics.DrawWhatever(data.ElementAt(currentIndex), font, Brushes.Black, x, y);
y += lineHeight;
currentIndex++;
}
args.HasMorePages = currentIndex < data.Count();
}
}