2017-02-27 4 views
1

Sagen wir, ich habe eine Tabelle mit 20 Zeilen, und ich möchte 5 Mitarbeiternamen auf jeder Seite drucken. Insgesamt 4 Seiten.C# Drucken mehrerer Seiten aus SQL-Ergebnis

Das Problem mit meinem aktuellen Code ist, dass es versucht, jeden Mitarbeiternamen auf der ersten Seite anzuzeigen. Zusätzlich endet es in einer Endlosschleife. Dies ist mein Code:

DataTable dt = new DataTable(); 

private void FillDataTable() 
    { 
     SqlConnection sqlConnection = GetConnection(); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader reader; 

     string query = 
     @"SELECT * FROM EMPLOYEES ORDER BY ID"; 

     cmd.CommandText = query; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = sqlConnection; 

     sqlConnection.Open(); 

     reader = cmd.ExecuteReader(); 

     if (reader.HasRows) 
     { 
      dt.Load(reader); 
     } 
     else 
     { 
      Console.WriteLine("No rows found."); 

     } 
     reader.Close(); 
     sqlConnection.Close(); 
    } 

private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    {   
     foreach(DataRow row in dt.Rows) 
     {  
      e.Graphics.DrawString(row[4].ToString(), new Font("Arial", 12, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, y, new StringFormat()); 

      y += 100; 

      if (itemperpage < 5) 
      { 
       itemperpage += 1; 
       e.HasMorePages = false; 
      } 
      else 
      { 
       e.HasMorePages = true; 

      } 

     }      
    } 

private void printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) 
    { 
     y = 80; 
     itemperpage = 0; 
    } 

Was ich hier fehlt? Wie werden nur 5 Mitarbeiter-Namen auf jeder Seite angezeigt, bis die SQL-Ergebnistabelle fertig ist?

+1

Sie brauchen eine Pause Zustand, wenn Sie HasMorePages auf true setzen, müssen Sie von der korrekten in den Datatable Reihen versetzt starten, wenn Sie auf der nächsten Seite beginnen, und Sie müssen itemperpage auf Null setzen. – john

Antwort

0

Ich habe @Ross Bush Code ein bisschen bearbeitet und jetzt scheint es zu funktionieren.

private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    { 
     neturalDataSet.centersDataTable table = new neturalDataSet.centersDataTable(); 

     centersTableAdapter.Fill(table); 

     y = 80; 

     itemperpage = 0; 


     _CurrentPageNumber++; 

     if(_CurrentPageNumber != 1) 
     { 
      skip += 6; 
     } 

     var query = table.AsEnumerable().Skip(skip); 

     foreach (DataRow row in query.CopyToDataTable().Rows) 
     { 
      e.Graphics.DrawString(row[0].ToString(), new Font("Arial", 12, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, y, new StringFormat()); 

      y += 100; 

      if (itemperpage < 5) 
      { 
       itemperpage += 1; 
       e.HasMorePages = false; 

      } 
      else 
      { 
       e.HasMorePages = true; 
       return; 
      } 

     } 

    } 
1

Sie müssen die Seitenanzahl manuell verfolgen, da die Seiteninformationen nur Eigenschaften enthalten, die die Seite beschreiben, nicht den Druckprozess. Dann können Sie Ihre DataTable als IEnumerable und verwenden Sie die Ling Skip() und Take() Erweiterung Methoden, um die Codierung zu erleichtern. Wenn Sie mit einem reduzierten Satz auf eine Datatable zurückübertragen, können Sie mit Ihrem exzidierenden Code fortfahren.

using System.Linq; 
    ... 

    private int _CurentPageNumber = 0; 

    private void printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) 
    { 
     y = 80; 
     itemperpage = 0; 
     _CurentPageNumber = 0; 
    } 

    private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    { 
     _CurentPageNumber++; 

     int skip = (_CurentPageNumber - 1) * itemperpage; 

     var query = dt.AsEnumerable().Skip(skip).Take(itemperpage); 

     foreach (DataRow row in query.CopyToDataTable().Rows) 
     { 
      e.Graphics.DrawString(row[4].ToString(), new Font("Arial", 12, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, y, new StringFormat()); 
     } 
    } 
+0

var query = dt.AsEnumerable(). Skip (Überspringen) .Take (itemperpage); Abfrage ist seltsam null. Meine DataTable ist sicherlich mit Daten gefüllt. Wie kann das passieren? –

+1

Dann hast du noch etwas anderes vor. Die einzige Sache, die den Code, den ich hinzugefügt habe, zurückgeben würde, ist leer, wenn Sie _CurrentPageNumber zwischen den Druckläufen nicht auf Null zurücksetzen oder wenn Sie itemperpage auf Null setzen. Ich schlage vor, Sie fügen einige Haltepunkte hinzu und sehen, wo es scheitert. –