2009-11-08 19 views
1

Je rencontre une liste d'impression de problèmeVoir les éléments. le problème que je pense est à private void PrintPageDetail(PrintPageEventArgs e) C'est donc ce qui se passe:Problème lors de l'impression de plusieurs pages ListView en C#. Je ne peux pas le comprendre

  1. elle imprime ce qui convient sur une page à plusieurs reprises. (Il y a plus de données que ce qui est imprimé) bien que le pied de page et l'en-tête s'impriment correctement avec les bons numéros de page. et j'ai du mal à l'obtenir pour effacer la mémoire à chaque fois pour mapper les nouvelles données sur la page suivante. L'aperçu avant impression et l'impression ne s'arrêteront pas, sauf si j'appuie sur annuler (probablement en raison de la boucle indéfinie "retour;").

Merci pour toute aide

private void PrintDocument(object sender, PrintPageEventArgs e) 
    { 
     // Use inches for all measurements. 

     e.Graphics.PageUnit = GraphicsUnit.Inch; 

     PrintPageHeader(e); 

     PrintPageDetail(e); 

     PrintPageFooter(e); 
    } 

    // Print the page header/footer/details. 
    private void PrintPageHeader(PrintPageEventArgs e) 
    { 
     e.Graphics.DrawString("Factors List Report", 
           _headerFont, _reportBrush, 3.0F, 0.75F); 
     e.Graphics.DrawLine(_reportPen, 0.5F, 1.15F, 7.5F, 1.15F); 
    } 

    private void PrintPageFooter(PrintPageEventArgs e) 
    { 
     e.Graphics.DrawLine(_reportPen, 1.0F, 10.0F, 7.5F, 10.0F); 

     e.Graphics.DrawString("Printed on " + DateTime.Now.ToLongDateString(), 
           _footerFont, _reportBrush, 1F, 10.2F); 

     _pageNumber++; 
     e.Graphics.DrawString(string.Format("Page: {0}", _pageNumber), 
           _footerFont, _reportBrush, 7F, 10.2F); 
    } 

    private void PrintPageDetail(PrintPageEventArgs e) 
    { 
     // Create variables to hold position on page. 
     float leftMargin = e.MarginBounds.Left; 
     float topMargin = e.MarginBounds.Top; 
     float i = 1.25F; 


     e.HasMorePages = false; 
     foreach (string printerLine in _factorsView) 
     { 
      e.Graphics.DrawString(printerLine, _detailFont, _reportBrush, 1.0F, i); 


      if (i >= 9.75) 
      { 
       i += 1.25F; 
       e.HasMorePages = true; 
       return; 
      } 
      else 
       i += .25F; 
     } 
    } 
} 

Répondre

0

Le problème est le fait que chaque fois que vous entrez dans PrintPageDetail (PrintPageEventArgs e), vous commencez au début de _factorsView parce que vous utilisez une boucle foreach . Vous devrez à la place garder la trace de l'endroit où vous êtes en dehors de cette méthode. Quelque chose comme ceci:

int myLocation = 0; 

private void PrintPageDetail(PrintPageEventArgs e) 
    { 
     // Create variables to hold position on page. 
     float leftMargin = e.MarginBounds.Left; 
     float topMargin = e.MarginBounds.Top; 
     float i = 1.25F; 


     e.HasMorePages = false; 
     while(myLocation < _factorsView.Length) 
     { 
      e.Graphics.DrawString(_factorsView[myLocation], _detailFont, _reportBrush, 1.0F, i); 
      myLocation++; 


      if (i >= 9.75) 
      { 
       i += 1.25F; 
       e.HasMorePages = true; 
       return; 
      } 
      else 
       i += .25F; 
     } 
    } 

Je ne sais pas quel type _factorsView est donc l'indexation peut varier en fonction de quel type il est, mais cela devrait vous donner une idée.