2012-02-09 7 views
0

私はこの大きな問題をC#で解決しようとしました。 私は21の記事(Bill)チケットフォーマットを印刷しようとしていますが、紙のロールには限界があり、いくつかのページは、私はあなたがそれをやっていないことだと思うの印刷を分けたが、私はそれが記事の#17を印刷し、#18で、別のページに進みページからジャンプを行うことはできません..System.Drawing&eHasMorePagesの問題

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

を助けてください右。それはこのようなものに行く必要があります。

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

ので、PrintDocumentPrintイベントの後、あなたはアイテムを描画するために、あなたのメソッドを呼び出して、それが法の変数外に最後の塗装のアイテムを追跡し、それを知るために再び呼び出されたときどこから始めるか。そして、次のページに行くべき項目になると、それは真を返します。