我正在我的C# WinForms应用程序中使用一个函数,该函数允许我将仓库提货单打印到PrintDocument,如下所示:
我使用下面的C#代码来生成这个:
private void pdPick_PrintPage(object sender, PrintPageEventArgs ev) {
pdPick.DefaultPageSettings.Landscape = true;
pdPick.DefaultPageSettings.Margins = new Margins ( 50, 50, 50, 50 );
pdPick.PrinterSettings.DefaultPageSettings.Margins = new Margins ( 50, 50, 50, 50 );
float yPos;
count = 0;
int leftMargin = (int)ev.MarginBounds.Left;
int rightMargin = (int)ev.MarginBounds.Right;
int topMargin = (int)ev.MarginBounds.Top;
int bottomMargin = (int)ev.MarginBounds.Bottom;
float linesPerPage;
bool moreRecs = true;
int lPos;
// If this is the first page, print a report header
if (pageCounter == 1) {
/* PRINT A REPORT HEADER HERE */
}
else { // if this is a subsequent page, print an abbreviated header
/* PRINT A PAGE HEADER HERE */
}
linesPerPage = ( ev.MarginBounds.Height - yPos ) / ( printFont.GetHeight ( ev.Graphics ) + 3 );
// Cycle through items
while ( curCount < boxCount && count < linesPerPage ) {
// PRINT ITEM DETAIL INFO FIRST...
// Now we cycle through the pick bins for the item...
foreach (PickItem record in pickItems) {
/*
*
* The issue is that I need to check inside this loop to see if I hit the bottom of the page,
* and if so, I need to start a new page and continue printing whatever remains inside this loop.
*
*
*/
}
yPos += 10;
count++;
curCount++;
moreRecs = count < boxItems.Count;
if ( moreRecs ) {
pageCounter++;
ev.HasMorePages = true;
}
else {
pageCounter = 1;
curCount = 0;
yPos += headerFont.Height + 10;
ev.HasMorePages = false;
return;
}
}
}
EDIT我删除了打印细节以澄清问题并解决有关重构的注解。
问题在于:从代码中可以看到,打印序列有两个循环。第一个循环获取提货订单中的产品列表,从中打印标题、UPC代码和该商品的总提货量。在该循环内部是 * 另一个 * 循环,从中获取提货位置列表。因此可能需要从多个位置检索产品以完成该行项目。现在,只要我不超过一页,一切都很好。挑战是这样的。显然,如果我有更多的产品,将适合在一页内,我需要做一个分页符。问题是,我也需要检查我在第二个循环内的页面中的位置,如果是这样,我需要开始一个新的页面,并从我离开的地方继续。例如,对于列表中的第三个产品,如所包含的屏幕截图中所示,如果我打印了第一个bin位置,然后耗尽了页面空间,我需要弹出页面,打印新的页眉,然后继续打印该产品的其余仓位位置,接着继续打印订单中的任何剩余产品。
从我所能找到的一切来看,我不能简单地在内部循环中执行ev.HasMorePages=true;
,因为这会导致整个打印序列重新开始,而这不是我想要的--这只会导致一个无限循环。我还没有找到任何关于使用嵌套循环打印到PrintDocument的示例或SO帖子。
有人能帮我了解如何解决这个问题吗?
1条答案
按热度按时间eqqqjvef1#
如果您将每个组的
PickItem
对象 * 排队 * 进行打印,这就不是一个棘手的问题。在这种情况下,您需要做的是:1.打印当前组并将其项 * 入队 * 到
Queue<PickItem>
类型的类字段中。1.循环队列以打印每个项目,并在
Y
位置仍在MarginBounds
内时将其从集合中 * 出列 *。1.绘制组和项时,如果
Y
位置加上固定/可变行高(组和项的行/列计算)超过e.MarginBounds.Bottom
值,则请求新页。示例