2017-02-27 11 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; 
    } 

私はここで何が欠けていますか? SQL結果表が完成するまで各ページに5人の従業員名を表示するには?

+1

あなたがtrueにHasMorePagesを設定するとき、あなたは、次のページを起動し、あなたがゼロにitemperpageをリセットする必要がある場合のDataTableの行に正しいオフセットから開始する必要がありますブレーク条件を必要としています。 – john

答えて

0

@Ross Bush Codeを少し編集しましたが、今はうまくいきます。

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

ページ情報には印刷プロセスではなく、ページを説明するプロパティしかないため、手動でページカウントを追跡する必要があります。 DataTableIEnumerableとし、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()。スキップ(スキップ).Take(itemperpage);クエリが間違ってnullです。私のDataTableは確かにデータで満たされています。これはどうしたらできますか? –

+1

あなたは何か別のことが起こっています。追加したコードを空にする唯一のことは、印刷実行の間に_CurrentPageNumberをゼロにリセットしないか、itemperpageをゼロに設定した場合です。いくつかのブレークポイントを追加して、どこが失敗するかを確認することをお勧めします。 –

関連する問題