0

我有几天试图解决我在 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
4

1 回答 1

1

我认为你做得不对。它应该是这样的:

    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。

于 2012-02-09T21:04:54.860 回答