C# Windows Forms应用打印Panel控件内容输出空白纸张问题求助
WinForms打印Panel收据空白问题修复方案
问题根因
- 核心问题1:代码中定义了两个独立的
PrintDocument对象(设计器拖入的printDocument1、手动声明的printdoc1),且手动声明的printdoc1没有绑定PrintPage事件,导致打印时不会执行绘制图片的逻辑 - 核心问题2:打印逻辑嵌套混乱,
printDocument1_PrintPage事件中调用Print()方法,而Print()方法内又触发另一个打印对象的打印流程,逻辑完全错位 - 次要问题:调用
DrawToBitmap前未确保Panel内容完全渲染,可能导致生成空白位图
修复方案
步骤1:清理冗余声明
删掉手动声明的冗余打印对象,统一使用设计器创建的printDocument1,删除原有Print(Panel pnl)、printdoc1_PrintPage两个错位的方法。
步骤2:修正事件绑定与打印逻辑
修改后关键代码如下:
namespace MakeyMakey { public partial class Form1 : Form { public void Gridsettings() { // 原有逻辑不变 GVReceipt.ScrollBars = ScrollBars.None; GVReceipt.RowHeadersVisible = false; GVReceipt.ColumnCount = 3; GVReceipt.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; GVReceipt.CellBorderStyle = DataGridViewCellBorderStyle.None; } public Form1() { InitializeComponent(); // 新增:绑定打印事件 printDocument1.PrintPage += printDocument1_PrintPage; // 原有构造逻辑不变 pCompanyImage.SizeMode = PictureBoxSizeMode.StretchImage; Bitmap Logo = new Bitmap(Bitmap.FromFile(@"C:/Users/manue/source/repos/MakeyMakey/MakeyMakey/logo.png")); pCompanyImage.Image = MakeBW(Logo); QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode("Hier kann so gut wie alles stehen", QRCodeGenerator.ECCLevel.Q); QRCode qrCode = new QRCode(qrCodeData); Bitmap qrCodeImage = qrCode.GetGraphic(20); pQRCode.Image = qrCodeImage; panel1.Height = GVProduct.Height + 220; GVReceipt.Columns.Add("Name", "Name"); GVReceipt.Columns.Add("QTY", "QTY"); GVReceipt.Columns.Add("Price", "Price"); GVReceipt.Columns[0].Width = 50; GVReceipt.Columns[1].Width = 15; GVReceipt.Columns[2].Width = 50; } // 其余原有方法(button1_Click、GVResize、MakeBW、Calc等)逻辑不变,此处省略 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // 直接在打印事件中生成Panel位图并绘制 panel1.Refresh(); Bitmap memoryImage = new Bitmap(panel1.Width, panel1.Height); panel1.DrawToBitmap(memoryImage, new Rectangle(0, 0, panel1.Width, panel1.Height)); e.Graphics.DrawImage(memoryImage, 0, 0); } private void btnPrinter_Click(object sender, EventArgs e) { // 配置打印参数 printDocument1.PrinterSettings.PrinterName = "Generico"; printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", panel1.Width, panel1.Height); // 弹出预览 PrintPreviewDialog previewdlg = new PrintPreviewDialog(); previewdlg.Document = printDocument1; previewdlg.ShowDialog(); // 执行打印 printDocument1.Print(); // 打印完成后再清空数据 GVProduct.Rows.Clear(); GVReceipt.Rows.Clear(); Calc(); } } }
额外注意
如果修复后仍有空白,检查panel1是否处于界面可见区域,DrawToBitmap对隐藏控件的支持存在兼容性问题,如需隐藏打印可临时将Panel移到可视区域外,打印完成后再复原位置。
内容的提问来源于stack exchange,提问作者Manuel P
相关产品推荐
相关产品推荐

