DataTable单元格分页打印问题:无限分页与空值页无法跳过
需求与问题
我有如下DataTable:
| rowNR | L1 | L2 | L3 | L4 |
|---|---|---|---|---|
| row1 | Listing1 | Listing2 | Listing3 | Listing4 |
| row2 | Listing1 | Listing2 | Listing3 | Listing4 |
| row3 | Listing1 | Listing2 | Listing3 | Listing4 |
| row4 | Listing1 | Listing2 | Listing3 | Listing4 |
| row5 | Listing1 | Listing2 | Listing3 | Listing4 |
我希望将每行中所有“Listing”相关单元格的内容单独打印到新页面,例如:第1页打印row1的Listing1,第2页打印row1的Listing2……按此示例共需20页。
问题1:初始代码导致无限分页,无法停止打印
我的初始代码如下:
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { var doc = sender as PrintDocument; var curX = e.MarginBounds.X + 11; var curY = e.MarginBounds.Y + 11; Pen pen = new Pen(ColorTranslator.FromHtml("#FFBD2D"), 1f); int checkedrows = 0; int sum = 0; using (var fontNormal = new System.Drawing.Font("Arial", 8)) using (var sf = new StringFormat()) { sf.Alignment = sf.LineAlignment = StringAlignment.Center; int itemHeight = (int)fontNormal.GetHeight(e.Graphics) + 1; for (int row = x; row < dt.Rows.Count; row++) { for (int j = y; j < dt.Columns.Count; j++) { if (x != row || y != j) { x = row; y = j; e.HasMorePages = true; return; } else { if ("Listing1" == dt.Columns[j].ColumnName || "Listing2" == dt.Columns[j].ColumnName || "Listing3" == dt.Columns[j].ColumnName || "Listing4" == dt.Columns[j].ColumnName) { if (dt.Rows[row][j].ToString() == "") continue; var imgRect = new Rectangle(0, 0, 160, 160); var labelRect = new Rectangle( imgRect.Right, imgRect.Bottom, imgRect.Width, itemHeight); using (var qrImage = Utils.QRCode.GenerateQRCODE(dt.Rows[row][j].ToString())) e.Graphics.DrawImage(qrImage, imgRect); e.Graphics.DrawLine(pen, curX, curY, curX, curY + 139);//|<left e.Graphics.DrawLine(pen, curX, curY + 139, curX + 196, curY + 139);// _bottom e.Graphics.DrawLine(pen, curX + 196, curY + 139, curX + 196, curY); //>|right e.Graphics.DrawLine(pen, curX, curY, curX + 196, curY); // -up e.Graphics.RotateTransform(90); e.Graphics.DrawString(dt.Rows[row][j].ToString(), fontNormal, Brushes.Black, labelRect, sf); e.Graphics.ResetTransform(); //curX = imgRect.Right; //+ 30 e.HasMorePages = false; } } } } } refreshprintbtn.Enabled = true; groupBox1.Text = "QR CODE | Codes: " + checkedrows + " / " + sum; }
更新(2024.12.04):解决无限分页,但无法跳过空值页面
修改后的代码解决了无限分页问题,但无法跳过空值页面(即dt.Rows[x][y].ToString()为空的情况)。修改后的代码如下:
private int x = 0; private int y = 26; private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { var doc = sender as PrintDocument; var curX = e.MarginBounds.X + 11; var curY = e.MarginBounds.Y + 11; //bool toprint = true; if ("Listare1" == dt.Columns[y].ColumnName || "Listare2" == dt.Columns[y].ColumnName || "Listare3" == dt.Columns[y].ColumnName || "Listare4" == dt.Columns[y].ColumnName) { if (dt.Rows[x][y].ToString() != "") { using (var pen = new System.Drawing.Pen(ColorTranslator.FromHtml("#FFBD2D"))) using (var fontNormal = new System.Drawing.Font("Arial", 10)) { e.Graphics.DrawLine(pen, curX, curY, curX, curY + 139);//|<left e.Graphics.DrawLine(pen, curX, curY + 139, curX + 196, curY + 139);// _bottom e.Graphics.DrawLine(pen, curX + 196, curY + 139, curX + 196, curY); //>|right e.Graphics.DrawLine(pen, curX, curY, curX + 196, curY); // -up var imgRect = new Rectangle(0, 0, 160, 160); using (var qrImage = Utils.QRCode.GenerateQRCODE(dt.Rows[x][y].ToString())) e.Graphics.DrawImage(qrImage, imgRect);//RotateImage(qrImage, -90), imgRect); } } } if (y < 51) { y = y + 9; e.HasMorePages = true; } else { y = 26; x++; } if (x < dt.Rows.Count) { e.HasMorePages = true; } else { return; } refreshprintbtn.Enabled = true; // groupBox1.Text = "QR CODE | Codes: " + checkedrows + " / " + sum; }
内容的提问来源于stack exchange,提问作者MyAccount
相关产品推荐
相关产品推荐

