如何批量打印多个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
相关产品推荐
相关产品推荐

