Pregunta

I have several days trying to solve this big problem I have in C #: I am trying to Print 21 Articles (Bill) Ticket Format, but the paper roll has a limit and occupied several pages divided print but I can not make it do the jump from page to print the article # 17 and continue to another page with the # 18, please help..

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
¿Fue útil?

Solución

I think that you are not doing it right. It should go something like this:

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

So, after PrintDocument Print event, you call your method to draw items, and it tracks last painted item in variable outside of the method, so when it is called again to know where to start from. And when it comes to item that should go to next page, it returns true.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top