質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

Q&A

解決済

1回答

3487閲覧

テーブルの内容を1ページ50行で200ページ印刷したい

hinatti

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

0グッド

0クリップ

投稿2017/09/13 07:38

編集2017/09/13 08:08

###前提・実現したいこと
foreachの読み取り位置を記憶して50行ずつ印刷したい

###発生している問題・エラーメッセージ

同じ50行が200ページ印刷されてしまう

###該当のソースコード

C#

1 /// <summary> 2 /// 降順印刷ボタンのイベントハンドラ 3 /// product_tableを降順に並べ替えて印刷 4 /// </summary> 5 /// <param name="sender">使用しない</param> 6 /// <param name="e">使用しない</param> 7 private void buttonDescendingOrderPrint_Click(object sender, EventArgs e) 8 { 9 string sql = @" 10 SELECT * 11 FROM product_table 12 ORDER BY product_id DESC;"; 13 14 using (connection = new SqlConnection(Properties.Settings.Default.ConnectionString)) 15 { 16 try 17 { 18 connection.Open(); 19 } 20 catch (Exception ex) 21 { 22 MessageBox.Show("データベースを開くのに失敗しました。", "error", MessageBoxButtons.OK, MessageBoxIcon.Error); 23 System.Diagnostics.Debug.WriteLine(ex.ToString()); 24 } 25 26 List<ProductData> productList = new List<ProductData>(); 27 28 SqlCommand command = new SqlCommand(sql, connection); 29 using (SqlDataReader reader = command.ExecuteReader()) 30 { 31 while (reader.Read() == true) 32 { 33 ProductData productData = new ProductData(); 34 productData.ProductId = reader["product_id"].ToString(); 35 productData.BasicOrderLot = reader["basic_order_lot"].ToString(); 36 productData.ProductCode = reader["product_code"].ToString(); 37 productData.ChassisNumber = reader["chassis_number"].ToString(); 38 productData.AssembledYmd = reader["assembled_ymd"].ToString(); 39 productData.AssembledHms = reader["assembled_hms"].ToString(); 40 productData.StructNumber = reader["struct_number"].ToString(); 41 productData.YyyyMm = reader["yyyymm"].ToString(); 42 43 productList.Add(productData); 44 } 45 reader.Close(); 46 } 47 48 productDataBindingSource.DataSource = productList; 49 PrintOut(); 50 } 51 } 52 53 /// <summary> 54 /// PrintOutメソッド 55 /// 印刷ダイアログを表示して印刷する 56 /// </summary> 57 private void PrintOut() 58 { 59 using (PrintDocument document = new PrintDocument()) 60 { 61 document.PrintPage += new PrintPageEventHandler(PrintPage); 62 PrintDialog log = new PrintDialog(); 63 if (log.ShowDialog() == DialogResult.Cancel) 64 { 65 return; 66 } 67 document.Print(); 68 } 69 } 70 71 /// <summary> 72 /// 1ページ印刷するイベントハンドラ 73 /// 1ページ分の印刷設定 74 /// </summary> 75 /// <param name="sender">使用しない</param> 76 /// <param name="e">使用する</param> 77 private void PrintPage(object sender, PrintPageEventArgs e) 78 { 79 int line = 0; 80 int x, y = 20; 81 e.HasMorePages = true; 82 Font font = new Font("MS ゴシック", 12); 83 84 foreach (ProductData data in productList) 85 { 86 x = 30; 87 e.Graphics.DrawString(data.ProductId, font, Brushes.Black, x, y); 88 x = x + 80; 89 e.Graphics.DrawString(data.BasicOrderLot, font, Brushes.Black, x, y); 90 x = x + 90; 91 e.Graphics.DrawString(data.ProductCode, font, Brushes.Black, x, y); 92 x = x + 80; 93 e.Graphics.DrawString(data.ChassisNumber, font, Brushes.Black, x, y); 94 x = x + 60; 95 e.Graphics.DrawString(data.AssembledYmd, font, Brushes.Black, x, y); 96 x = x + 150; 97 e.Graphics.DrawString(data.AssembledHms, font, Brushes.Black, x, y); 98 x = x + 100; 99 e.Graphics.DrawString(data.StructNumber, font, Brushes.Black, x, y); 100 x = x + 100; 101 e.Graphics.DrawString(data.YyyyMm, font, Brushes.Black, x, y); 102 y = y + 20; 103 line++; 104 105 if (line == 50) 106 { 107 break; 108 } 109 } 110 111 e.Graphics.DrawString(String.Format("{0}ページ", page), new Font("MS ゴシック", 12) 112 , Brushes.Black, 365, 1110); 113 page++; 114 115 if (MAX_PAGE == page) 116 { 117 e.HasMorePages = false; 118 connection.Close(); 119 } 120 } 121 } 122}

###補足情報(言語/FW/ツール等のバージョンなど)
5852232 2A11B5632ZABFA157220000825 18:08:57 8D11080200008
このようなデータが1万行あります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

PrintPageメソッドは、1ページ印刷される毎に1回呼び出されます。
なので毎回呼び出されるたびに、次の50行データに差し替える必要があります。

現在のコードでは、毎回先頭の50行データをセットしているため、
同じページが何ページにもわたって印刷されます。

追加
pageが1からカウントされる前提になりますが、下記では如何でしょうか?

C#

1//変更前 2foreach (ProductData data in productList) 3//変更後 4var ddd = productList.Skip((page - 1) * 50).Take(50); 5foreach (ProductData data in ddd)

投稿2017/09/13 07:49

編集2017/09/13 08:30
kikukiku

総合スコア514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hinatti

2017/09/13 07:59

次の50行に差し替えていく方法が分からなくてテラテイルで質問したんですよね… 言葉足らずでした。
kikukiku

2017/09/13 08:28

テストしていませんが、具体的な方法を記載しました
hinatti

2017/09/13 08:32

pageは1から始まる前提なので大丈夫です! _d_m_itemってdataを格納してるリスト名が来るんですかね?
kikukiku

2017/09/13 08:33

間違えたのですでに修正しています。
hinatti

2017/09/13 08:37

わざわざありがとうございます! おかげさまで期待していた動作になりました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問