我有点困惑如何使用HasMorePages
属性。我尝试通过YPosition
方法打印更多的页面,但它会导致打印页面的无限循环。
这是我的代码:
private float YPosition()
{
return this.TopMargin + ((float)this.LinesCount * this.Font.GetHeight(this.Graphics) + (float)this.ImagesHeight);
}
private void TicketPrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
this.Graphics = e.Graphics;
foreach (Tuple<Object, LineTypes> tuple in this.Objects)
{
switch (tuple.Item2)
{
case LineTypes.LINE:
this.Graphics.DrawString((String)tuple.Item1, this.Font, this.SolidBrush, this.LeftMargin, this.YPosition(), new StringFormat());
this.LinesCount++;
break;
case LineTypes.IMAGE:
Image Image = (Image)tuple.Item1;
// Center Image, using PaperSize
Graphics GraphicsImage = Graphics.FromImage(Image);
RectangleF RectangleF = e.MarginBounds;
RectangleF.Offset(-e.PageSettings.HardMarginX, -e.PageSettings.HardMarginY);
float InchX = RectangleF.X / 100f + (RectangleF.Width / 100f - (float)Image.Width / GraphicsImage.DpiX) / 2f;
Int32 MillimeterX = (Int32)Math.Ceiling(InchX / 0.039370);
this.Graphics.DrawImage(Image, new Point((int)this.LeftMargin + (MillimeterX / 2), (int)this.YPosition()));
double a = (double)Image.Height / 58.0 * 15.0;
this.ImagesHeight += (int)Math.Round(a) + 3;
break;
}
if ((YPosition() * 4) >= e.PageSettings.PrintableArea.Height)
{
e.HasMorePages = true;
return;
}
else
{
e.HasMorePages = false;
}
}
}
YPosition
表示页面中每行或图像的高度。
如果处理了所有对象,我如何防止打印和停止的无休止循环?
2条答案
按热度按时间w8f9ii691#
你需要使用while循环和Enumerator来代替for循环。枚举器保存您正在处理的对象的状态,该对象作为成员存储在表单示例上。使用PrintDocument类的BeginPrint和EndPrint事件初始化和清理枚举器。
因为我们现在有了一个枚举器,PrintPage实现将使用它。它调用MoveNext并将结果存储在
HasMorePages
中。代码的其余部分与您之前的代码类似,但请确保将页面上位置的计算保持在该方法的本地。不要(ab)使用示例变量。请注意,对Current
的调用是while循环中的第一条语句。使用此代码,您可以遍历集合,如果页面已满,则中断循环,如果没有更多的项目要打印,则停止迭代和打印。
如果打印完成,Endprint被调用,它的任务是清理枚举器。
kiz8lqtg2#
修复在C#中使用HasMorePages打印时的分页问题。关于这段代码的解释:您可以添加许多行或从数据库中读取,以查看打印时分页的结果,例如,我只手动向表中添加了两行,因为行数很少,所以没有分页。手动添加多行或将数据库中的信息插入网格视图。这是一个例子: