2017-02-27 21 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设置为零。我建议你添加一些断点并查看失败的位置。 –