You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataTable单元格分页打印问题:无限分页与空值页无法跳过

需求与问题

我有如下DataTable:

rowNRL1L2L3L4
row1Listing1Listing2Listing3Listing4
row2Listing1Listing2Listing3Listing4
row3Listing1Listing2Listing3Listing4
row4Listing1Listing2Listing3Listing4
row5Listing1Listing2Listing3Listing4

我希望将每行中所有“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:44:54