Проблемы System.Drawing и e.HasMorePages - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть несколько дней, чтобы решить эту большую проблему, которая у меня есть в C #: я пытаюсь напечатать 21 формат билета на статьи (Билл), но у бумажного рулона есть предел, и он занимает несколько страниц, разделенных печатью, но я не могу сделатьвыполните переход со страницы для печати статьи № 17 и перейдите на другую страницу с № 18, пожалуйста, помогите ..

private void DrawItems(System.Drawing.Printing.PrintPageEventArgs e)
        {
            int linesprinted = 0;
            int linesperpage = 17;
            int numberitems = items.Count; //21

            //numberitems / linespage = 1.23 = 2 Pages True :)

            if (linesprinted <= linesperpage)
            {
                linesprinted++;
                e.HasMorePages = false;
            }
            else {
                linesprinted=0;
                e.HasMorePages = true;
            }

//print items
            OrderItem ordIt = new OrderItem('?');

            gfx.DrawString("C/P   DESCRIPCION                  TOTAL", new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
            DrawEspacio();
            gfx.DrawString(DottedLine(), new Font(fontName, 9, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
            count++;

            foreach (string item in items)
            {

                String ItemCantidad = ordIt.GetItemCantidad(item);
                String ItemPrice = ordIt.GetItemPrice(item);
                Int16 not_equal = 0;


                gfx.DrawString(ItemCantidad + "  x", new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());

                line = ordIt.GetItemUnitPrice(item);
                line = AlignRightText(line.Length) + line;

                gfx.DrawString("                 " + line, printFont, myBrush, leftMargin, YPosition(), new StringFormat());

                string name = ordIt.GetItemName(item);

                leftMargin = 0;
                if (name.Length > maxCharDescription)
                {
                    int currentChar = 0;
                    int itemLenght = name.Length;

                    while (itemLenght > maxCharDescription)
                    {
                        line = ordIt.GetItemName(item);
                        gfx.DrawString("         " + line.Substring(currentChar, maxCharDescription), new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());

                        count++;
                        not_equal++;
                        if (not_equal == 1)
                        {
                            gfx.DrawString(ItemPrice, new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
                        }
                        currentChar += maxCharDescription;
                        itemLenght -= maxCharDescription;
                    }

                    line = ordIt.GetItemName(item);
                    gfx.DrawString("         " + line.Substring(currentChar, line.Length - currentChar), new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                    gfx.DrawString("-----", new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                }
                else
                {
                    gfx.DrawString("         " + ordIt.GetItemName(item), new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                    gfx.DrawString(ItemPrice, new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                    gfx.DrawString("-----", new Font(fontName, fontSize, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                }

            } //end foreach


            leftMargin = 0;
            gfx.DrawString(DottedLine(), new Font(fontName, 9, FontStyle.Regular), myBrush, leftMargin, YPosition(), new StringFormat());
            DrawEspacio();

        } //end function

1 Ответ

1 голос
/ 10 февраля 2012

Я думаю, что вы делаете это неправильно.Он должен выглядеть примерно так:

    private void MyPrintDocument_PrintPage(object sender,
        System.Drawing.Printing.PrintPageEventArgs e)
    {
        bool more = DrawItems(e.Graphics);
        if (more == true)
            e.HasMorePages = true;
    }

Итак, после события PrintDocument Print вы вызываете свой метод для рисования элементов, и он отслеживает последний нарисованный элемент в переменной вне метода, поэтомуэто вызвано снова, чтобы знать, с чего начать.И когда дело доходит до элемента, который должен перейти на следующую страницу, он возвращает true.

...