首页 > 解决方案 > 在 C# 中打印出面板

问题描述

再次,我问一个关于 USB 打印机的问题。然而,这一次,问题更多地在于频谱的编程端。

我有一个 Windows 窗体应用程序,我在其中生成收据,然后应该将其发送到打印机。以下事情起作用:生成收据,将数据发送到打印机。

然而,数据只是一张空纸条。我感觉软件忽略了面板内容,只是将空面板发送到打印机。

源代码如下:

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();
            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;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] row = new string[] {txtName.Text, txtQty.Text, txtPrice.Text };
            GVReceipt.Rows.Add(row);
            GVProduct.Rows.Add(row);
            Gridsettings();
            Calc();
            txtName.Clear();
            txtQty.Clear();
            txtPrice.Clear();
            txtName.Focus();
        }

        private void GVResize()
        {
            //MessageBox.Show(GVReceipt.Height.ToString());
            GVReceipt.Height = GVReceipt.ColumnHeadersHeight + GVReceipt.RowCount * GVReceipt.Rows[0].Height;
            //MessageBox.Show(GVReceipt.Height.ToString());
            panel1.Height += GVReceipt.Rows[0].Height;
            //MessageBox.Show(panel1.Height.ToString());
            GVReceipt.ClearSelection();
            Refresh();
        }

        private void GVReceipt_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

        }

        private void GVReceipt_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            panel1.Height = 389;
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }
        public Bitmap MakeBW(Bitmap Map)
        {
            Bitmap newbmp = new Bitmap(Map.Width, Map.Height); // New image

            for (int row = 0; row < Map.Width; row++) // Indicates row number

            {

                for (int column = 0; column < Map.Height; column++) // Indicate column number

                {

                    var colorValue = Map.GetPixel(row, column); // Get the color pixel

                    var averageValue = ((int)colorValue.R + (int)colorValue.B + (int)colorValue.G) / 3; // get the average for black and white

                    newbmp.SetPixel(row, column, Color.FromArgb(averageValue, averageValue, averageValue)); // Set the value to new pixel

                }

            }

            return newbmp;

        }
        public void Calc()
        {
            decimal total = 0;
            for(int i = 0; i < GVReceipt.RowCount-1; i++)
            {
                total += Convert.ToDecimal(GVReceipt.Rows[i].Cells[2].Value) * Convert.ToDecimal(GVReceipt.Rows[i].Cells[1].Value);
            }
            //Console.WriteLine("HELLO");
            //MessageBox.Show(total.ToString());
            lbltotal.Text = total.ToString() + "€&quot;;
            Refresh();
            GVResize();
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Print(panel1);
        }

        Bitmap MemoryImage;
        PrintDocument printdoc1 = new PrintDocument();
        PrintPreviewDialog previewdlg = new PrintPreviewDialog();
        public void GetPrintArea(Panel pnl)
        {
            MemoryImage = new Bitmap(pnl.Width, pnl.Height);
            Rectangle rect = new Rectangle(0, 0, pnl.Width, pnl.Height);
            pnl.DrawToBitmap(MemoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
        }
        public void printdoc1_PrintPage(object sender, PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(MemoryImage, 0, 0);
        }
        public void Print(Panel pnl)
        {
            GetPrintArea(pnl);
            printdoc1.PrinterSettings.PrinterName = "Generico";
            printdoc1.DefaultPageSettings.PaperSize = new PaperSize("Custom", panel1.Width, panel1.Height);
            previewdlg.Document = printdoc1;
            previewdlg.ShowDialog();
            printdoc1.Print();
        }

        private void btnPrinter_Click(object sender, EventArgs e)
        {
            printDocument1.Print();

            GVProduct.Rows.Clear();
            GVReceipt.Rows.Clear();

            Calc();
        }

        private void GVReceipt_RowsAdded_1(object sender, DataGridViewRowsAddedEventArgs e)
        {
            //GVResize();
        }
    }

我还包括了两张图片,一张显示收据的样子,另一张显示打印预览生成的内容。

我非常感谢有关该主题的任何帮助。收据的显示

空打印预览(等于结果)

标签: c#.netforms

解决方案


推荐阅读