e.HasMorePages не печатает 2-ю страницу на PrintPreviewDialog - PullRequest
0 голосов
/ 18 ноября 2018

Я хочу напечатать штрих-код всего элемента, используя PrintPreviewDialog. Написанный код работает нормально, но проблема в том, что на первой странице я назвал e.HasMorePages = true, которая создает 2-ю страницу, но не печатает 2-ю страницу. это означает, что 2-я страница стала пустой / пустой. Как вы можете видеть на картинке ниже, штрих-код в последней строке автоматически обрезается и не печатает оставшиеся штрих-коды на 2-й странице. Пожалуйста, помогите, как распечатать оставшийся штрих-код на 2-й странице. enter image description here

Как вы можете видеть на картинке выше, последняя строка автоматически обрезается, а вторая страница не печатается и получает пустую страницу.

PrintPreviewDialog code;

pd = new PrintDocument();
                pd.PrintPage += new PrintPageEventHandler(this.PrintBarcodeEvent_PrintPage);

                System.Windows.Forms.PrintDialog pdd = new System.Windows.Forms.PrintDialog();
                pdd.Document = pd;

                System.Windows.Forms.DialogResult result = pdd.ShowDialog();

                if (result == System.Windows.Forms.DialogResult.OK)
                {
                    System.Windows.Forms.PrintPreviewDialog pp = new System.Windows.Forms.PrintPreviewDialog();
                    pp.Document = pd;
                    result = pp.ShowDialog();

                    //pd.Print();
                }

Событие:

 // The PrintPage event is raised for each page to be printed. 
        private void PrintBarcodeEvent_PrintPage(object sender, PrintPageEventArgs e)
        {
            int startX = 5;
            int startY = 5;

            Database db = new Database();
            db.DBOpen();

            int NBbarcode_perLine = 5;
            int numbarcode = 0;

            int barcodePerPage = 35;
            int countBarcodePerPage = 0;

            for (int i = 0; i < listTobePrint.Count; i++)
            {
                String code = listTobePrint[i].Code;
                String name = db.GetByValue(Database.TABLE_ITEMS, Database.CODE_ITEMS, code, 2);
                String price = db.GetByValueForInt(Database.TABLE_ITEMS, Database.CODE_ITEMS, code, 8);

                Font printFont = new Font("Arial", 10.0f);

                e.Graphics.DrawString("Phulkari by VIRSA", printFont, System.Drawing.Brushes.Black,
                  startX, startY, new StringFormat());

                int x2 = startX + 3;
                int y2 = startY + 15;

                e.Graphics.DrawImage(Util.ImageWpfToGDI(Util.GenerateBarcode(code)), x2, y2, 100, 50);

                int x3 = startX;
                int y3 = y2 + 50;

                e.Graphics.DrawString(code, printFont, System.Drawing.Brushes.Black,
                    x3, y3, new StringFormat());

                int x4 = startX;
                int y4 = y3 + 15;

                e.Graphics.DrawString(name, printFont, System.Drawing.Brushes.Black,
                   x4, y4, new StringFormat());

                int x5 = startX;
                int y5 = y4 + 15;

                e.Graphics.DrawString("Rs." + price, printFont, System.Drawing.Brushes.Black,
                   x5, y5, new StringFormat());

                numbarcode++;
                countBarcodePerPage++;

                if (numbarcode < NBbarcode_perLine)
                    startX += 150;
                else
                {
                    startX = 5;
                    startY += 150; // space between 2 barcode in vertical (upper left). you have to adjust)
                    numbarcode = 0;
                }

                if (countBarcodePerPage >= barcodePerPage)
                {
                    //MessageBox.Show(countBarcodePerPage.ToString());

                    e.HasMorePages = true;
                    //startX = 5;
                    //startY = 5;
                } else
                {
                    e.HasMorePages = false;
                }
            }
            db.DBClose();
            listTobePrint.Clear();
        }

1 Ответ

0 голосов
/ 18 ноября 2018

Вы должны создать глобальную переменную countbar (не локально для PrintPage) или static и инициализировать To zéro. Каждый раз, когда вы устанавливаете для e.HasMorePages значение true, вызывается событие PrintPage Это не проблема для теста, но я думаю, что вы должны поместить db.open в событие BeginPrint и db.close в событие EndPrint. база данных открыта и закрывается при каждой печати страницы. (возможно, это не очень важно, но вы избегаете воссоздания одной и той же переменной db и ненужного тона)

    private void PrintBarcodeEvent_PrintPage(object sender, PrintPageEventArgs e)
    {
        int startX = 5;
        int startY = 5;

        Database db = new Database();
        db.DBOpen();

        int NBbarcode_perLine = 5;
        int numbarcode = 0;

        int barcodePerPage = 35;
        int countBarcodePerPage = 0;
        int totalcodebar = listTobePrint.Count;

        for (int i = 0; i < barcodePerPage; i++)
        {
            String code = listTobePrint[countbarcode].Code;
            String name = db.GetByValue(Database.TABLE_ITEMS, Database.CODE_ITEMS, code, 2);
            String price = db.GetByValueForInt(Database.TABLE_ITEMS, Database.CODE_ITEMS, code, 8);

            Font printFont = new Font("Arial", 10.0f);

            e.Graphics.DrawString("Phulkari by VIRSA", printFont, System.Drawing.Brushes.Black,
              startX, startY, new StringFormat());

            int x2 = startX + 3;
            int y2 = startY + 15;

            e.Graphics.DrawImage(Util.ImageWpfToGDI(Util.GenerateBarcode(code)), x2, y2, 100, 50);

            int x3 = startX;
            int y3 = y2 + 50;

            e.Graphics.DrawString(code, printFont, System.Drawing.Brushes.Black,
                x3, y3, new StringFormat());

            int x4 = startX;
            int y4 = y3 + 15;

            e.Graphics.DrawString(name, printFont, System.Drawing.Brushes.Black,
               x4, y4, new StringFormat());

            int x5 = startX;
            int y5 = y4 + 15;

            e.Graphics.DrawString("Rs." + price, printFont, System.Drawing.Brushes.Black,
               x5, y5, new StringFormat());

            numbarcode++;
            countbarcode++;

            if (numbarcode < NBbarcode_perLine)
                startX += 150;
            else
            {
                startX = 5;
                startY += 150; // space between 2 barcode in vertical (upper left). you have to adjust)
                numbarcode = 0;
            }

            if (countbarcode == totalcodebar) break;

            if (i == barcodePerPage - 1)
            {
                    db.DBClose();
                    e.HasMorePages = true;
                    return;
            }
        }
        e.HasMorePages = false;
        db.DBClose();
        listTobePrint.Clear();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...