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 に答える