2017-02-27 20 views
1

假設我有一個包含20行的表格,並且我想在每個頁面上打印5個員工姓名。共4頁。C#從SQL結果中打印多個頁面

我當前的代碼存在的問題是,它試圖在第一頁上顯示每個員工的姓名。另外它以無限循環結束。 這是我的代碼:

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; 
    } 

我在這裏錯過了什麼?如何在每個頁面上只顯示5個員工姓名,直到SQL結果表完成?

+1

當您將HasMorePages設置爲true時,您需要中斷條件,您需要在啓動下一頁時從DataTable行中正確的偏移量開始,並且需要將itemperpage重置爲零。 – john

回答

0

我編輯@羅斯布什編碼有點,現在看來工作。

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

您將需要手動跟蹤頁數,因爲頁面信息只具有描述頁面的屬性,而不是打印過程。然後,您可以將DataTable作爲IEnumerable,並使用Ling Skip()和Take()擴展方法使編碼更容易。使用縮減集重新轉換爲Datatable將允許您使用您的代碼執行遍歷。

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(skip).Take(itemperpage);查詢奇怪地爲空。我的DataTable肯定充滿了數據。這怎麼會發生? –

+1

然後你還有其他事情正在進行。唯一會使我添加的代碼返回空白的是,如果您不重置_CurrentPageNumber在打印運行之間爲零或者您將itemperpage設置爲零。我建議你添加一些斷點並查看失敗的位置。 –