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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:27:03