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

如何批量打印多个DataGridView?消除重复打印配置弹窗

问题描述

我正在使用DGVPrinterHelper批量打印多个DataGridView(简称DGV),目前每打印一个DGV都需打开打印配置窗口。当DGV数量多达10个甚至更多时,我需要重复点击“打印”按钮直至全部完成。请问是否可将所有DGV合并到一个文档中(每个DGV单独占一页)一次性打印,或是无需每次都打开该配置窗口?

当前实现代码

private void bttPrint_Click(object sender, EventArgs e)
{
    GenerateDataGridViewsForEachFixture();

    string partNumbersSubtitle = string.Join(", ", PartNumbers);

    foreach (var dataGrid in allDataGrids)
    {
        string fixtureNumber = dataGrid.Rows[0].Cells[0].Value.ToString();
        string lista = PartNumbers[0];

        // 配置并打印DataGridView
        DGVPrinter printer = new DGVPrinter();
        printer.Title = "Table: " + fixtureNumber;
        printer.SubTitle = "Lists: " + partNumbersSubtitle;
        printer.SubTitleFormatFlags = StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
        printer.PageNumbers = true;
        printer.PageNumberInHeader = false;
        printer.PorportionalColumns = true;
        printer.HeaderCellAlignment = StringAlignment.Near;
        printer.Footer = "Print DGV";
        printer.PrintDataGridView(dataGrid);
    }

}

private void GenerateDataGridViewsForEachFixture()
{
    var orderedFixtureGroups = setData
        .GroupBy(data => data.Table)
        .ToDictionary(
            g => g.Key,
            g => g
                .GroupBy(sd => sd.PartNumber)
                .Select(gp => gp.First())
                .OrderBy(sd => int.Parse(sd.Feeder))
                .ToList()
        );

    allDataGrids.Clear();

    foreach (var fixtureGroup in orderedFixtureGroups)
    {
        DataGridView dgv = new DataGridView();

        // 定义列
        dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "Table" });
        dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "TypeFeeder" });
        dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "Feeder" });
        dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "Position" });
        dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "Pup" });
        dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "PartNumber" });
        dgv.Columns.Add(new DataGridViewCheckBoxColumn { Name = "Missing" }); 

        foreach (var data in fixtureGroup.Value)
        {
            dgv.Rows.Add(data.Table, data.TipoFeeder, data.Feeder, data.Position, data.Pup, data.PartNumber, false);
        }

        allDataGrids.Add(dgv);
    }
}

解决方案

1. 合并所有DGV到一个打印作业,仅弹出一次配置窗口

通过手动控制PrintDocument的分页逻辑,将所有DGV合并到一个打印任务中,只触发一次打印配置窗口。

修改后的打印方法代码:

private void bttPrint_Click(object sender, EventArgs e)
{
    GenerateDataGridViewsForEachFixture();
    if (allDataGrids.Count == 0) return;

    string partNumbersSubtitle = string.Join(", ", PartNumbers);
    PrintDocument printDoc = new PrintDocument();
    int currentDgvIndex = 0;

    // 仅弹出一次打印配置对话框
    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDoc;
    if (printDialog.ShowDialog() != DialogResult.OK) return;

    printDoc.PrintPage += (s, pe) =>
    {
        if (currentDgvIndex >= allDataGrids.Count)
        {
            pe.HasMorePages = false;
            return;
        }

        var dataGrid = allDataGrids[currentDgvIndex];
        string fixtureNumber = dataGrid.Rows[0].Cells[0].Value.ToString();

        // 配置DGVPrinter参数
        DGVPrinter printer = new DGVPrinter();
        printer.Title = "Table: " + fixtureNumber;
        printer.SubTitle = "Lists: " + partNumbersSubtitle;
        printer.SubTitleFormatFlags = StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
        printer.PageNumbers = true;
        printer.PageNumberInHeader = false;
        printer.PorportionalColumns = true;
        printer.HeaderCellAlignment = StringAlignment.Near;
        printer.Footer = "Print DGV";

        // 将当前DGV打印到当前页
        printer.PrintDataGridView(dataGrid, pe);

        currentDgvIndex++;
        // 标记是否需要打印下一页
        pe.HasMorePages = currentDgvIndex < allDataGrids.Count;
    };

    printDoc.Print();
}

2. 跳过打印配置窗口,直接用默认打印机打印

如果不需要用户调整打印设置,可以直接调用静默打印逻辑,避免重复弹出窗口。

修改后的循环打印代码:

private void bttPrint_Click(object sender, EventArgs e)
{
    GenerateDataGridViewsForEachFixture();
    string partNumbersSubtitle = string.Join(", ", PartNumbers);

    foreach (var dataGrid in allDataGrids)
    {
        string fixtureNumber = dataGrid.Rows[0].Cells[0].Value.ToString();

        DGVPrinter printer = new DGVPrinter();
        printer.Title = "Table: " + fixtureNumber;
        printer.SubTitle = "Lists: " + partNumbersSubtitle;
        printer.SubTitleFormatFlags = StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
        printer.PageNumbers = true;
        printer.PageNumberInHeader = false;
        printer.PorportionalColumns = true;
        printer.HeaderCellAlignment = StringAlignment.Near;
        printer.Footer = "Print DGV";

        // 使用默认打印机直接打印,跳过配置对话框
        // 部分DGVPrinter版本支持silent参数,若不支持可尝试设置printer.PrintDialog = false
        printer.PrintDataGridView(dataGrid, true);
    }
}

内容的提问来源于stack exchange,提问作者Yuri Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:55:09