【发布时间】:2014-06-09 07:55:06
【问题描述】:
目标:打印出读入我的应用程序并存储在列表中的记录,例如http://www.codeproject.com/Tips/733680/Printing-and-Previewing-multiple-pages-in-Csharp 和https://stackoverflow.com/a/11067893/2952390。更重要的是,我想在第一页上打印出前 37 条记录(如果有那么多),然后在第二页上打印下 37 条,依此类推。这些信息显示在我的PrintDocument 中包含许多列的基本表中。我最多可以有 22500 条记录!例如,如果我有 104 条记录,我需要 3 页,总体布局应如下所示:
以下代码显示所有所有页面上的所有记录,但重叠。我可以看到代码已设法将记录划分为在正确位置一次显示 37 个,但页面不清晰,所以它只是重叠。此外,if 语句可能不正确,因为我不确定它是仅显示 74 条记录还是全部 104 条记录。
int currentpage = 0;
int pagesleft = 0;
readonly PrintDocument docccc = new PrintDocument();
readonly PrintPreviewDialog printpreviewdialog = new PrintPreviewDialog();
private void Summary_Preview(object sender, EventArgs e)
{
printpreviewdialog.Document = docccc;
docccc.DefaultPageSettings.Landscape = true;
docccc.PrintPage += new PrintPageEventHandler(Summary_English);
printpreviewdialog.ShowDialog();
}
private void Summary_Print(object sender, EventArgs e)
{
docccc.PrintPage += new PrintPageEventHandler(Summary_English);
printDialog1.Document = docccc;
docccc.DefaultPageSettings.Landscape = true;
printDialog1.ShowDialog();
if (printDialog1.ShowDialog() == DialogResult.OK)
{
docccc.Print();
}
}
private void Summary_English(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
// Title
// Extra text
// Table headers
int rec_count = Details.rec_num.Count; // Counts the total records from file
int pageCount = (rec_count + 37 - 1) / 37; // Calculates how many pages there should be
currentpage = currentpage + 1;
if (currentpage == 1)
{
pagesleft = pageCount;
}
e.Graphics.DrawString(currentpage.ToString() + " | " + pageCount.ToString(), new Font("Courier New", 8, FontStyle.Bold), Brushes.Gray,
new System.Drawing.Rectangle(22, 780, 1125, 15), Align_Centre);
int rec = 1; // Initiate record to read
int y = 257; // Initiate text position
for (; rec < rec_count; rec++)
{
e.Graphics.DrawString(Details.rec_num[rec - 1] + "\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(22, y, 32, 485));
e.Graphics.DrawString(Details.datetime[rec] + "\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(54, y, 96, 485));
e.Graphics.DrawString(Details.volt[rec] + "V\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(240, y, 40, 485));
e.Graphics.DrawString(Details.expectedAtime[rec] + " S\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(394, y, 68, 485));
e.Graphics.DrawString(Details.actualtime1[rec] + " S\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(462, y, 102, 485));
e.Graphics.DrawString(Details.expectedBtime[rec] + " S\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(564, y, 69, 485));
e.Graphics.DrawString(Details.actualtime2[rec] + " S\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(633, y, 102, 485));
e.Graphics.DrawString(Details.error[rec] + "\n", ar_7_reg, Brushes.Black, new System.Drawing.Rectangle(735, y, 92, 485));
y += 13; // Increment line gap between each rec
if (rec % 37 == 0)
{
y = 257;
}
if (currentpage < pageCount)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
}
【问题讨论】:
-
您的问题中缺少最重要的一段代码。您的 BeginPrint 事件处理程序。那是您打开文件 (?) 并初始化您的记录或页面计数器的地方。然后 PrintPage 事件处理程序简单地从文件中读取一条记录并打印它。最多 37 次。如果它达到 37 而没有遇到文件结尾,那么您需要将 HasMorePages 设置为 true。
-
每次循环执行时。它将从第一项开始。你也应该在你的项目列表中使用
skip。 -
@HansPassant 这很有道理,听起来与您在stackoverflow.com/a/13777923/2952390 中的预览答案相似。是否仍然可以在 foreach 循环中打印列表?这是因为有时我可能有 1,2,3,8,9,11 之类的记录...我不希望显示 1,2,3,4,5,6,或者我感到困惑:/ ?
-
*和你以前的类似
标签: c# winforms visual-studio printing