none
印刷時に最終ページに追加したデータ部分のみを改ページできますか? RRS feed

  • 質問

  • こんにちはzen73です。いつもお世話になってます。
    dataGridViewのデータ(テストの得点順位表)を印刷しています。
    最終ページに平均点を追加して表示していますが,
    平均点が最終ページ内に収まりきれない場合が想定されます。
    この場合,
    ページからはみ出したデータ(平均点)を次ページに表示することは可能でしょうか。

    private void printDocument1_PrintPage(object sender,
         System.Drawing.Printing.PrintPageEventArgs e)
    {
      do
        {
        ・・・・・・・・・・・・・・・・・・・・・
         //改ページの確認
             if (cnt >= maxrow)
             {
           e.HasMorePages = true;
                 break;
            }
         } while (rnum != dataGridView1.RowCount - 1);

         if (rnum == dataGridView1.RowCount - 1)
         {
              //最終ページにクラス毎男女別平均点を追加
      }
    }

    2006年9月20日 2:08

回答

  •  zen73 さんからの引用

    二つのもの「dataGridViewに表示されているデータ」と「平均点のデータ」を同じstring配列に入れるという理解でよろしいでしょうか。

    はい、その通りです。印刷データをまとめて用意しておいて、それをまとめて印刷します。バッチ処理的になります。
    2006年9月20日 8:29
    モデレータ

すべての返信

  • 収まるかどうかを考えて、

      e.HasMorePages = true;

    すればいいわけですね。

    そこのコードでやっていることそのものですよ。

    2006年9月20日 3:33
  • 仲博俊さん,ありがとうございます。
    できないものとばかり思い込んでいましたが,可能と知り喜んでいますが実現の方法がわかりません。プログラムは下のようなつくりになっています。
    cntで行数をウオッチしており,cntが50を超えた所で改ページさせたいのです。
    Aの場所で判断させたところ,dataGridViewのデータを読みに行ってしまいました。
    どの場所で,どのようにe.HasMorePages = true;を判断させるのでしょうか。


    if (rnum == dataGridView1.RowCount - 1)
    {
      //最終ページにクラス毎男女別平均点を追加
      for(int i=0;i<5;i++)
        {
          e.Graphics.DrawString(<i組男子の平均点>)
          cnt++;
          e.Graphics.DrawString(<i組女子の平均点>)
          cnt++;
          e.Graphics.DrawString(<i組全体の平均点>)
          cnt++;
       --A-- 
        }
       e.Graphics.DrawString(<学年男子の平均点>)
       cnt++;
       e.Graphics.DrawString(<学年女子の平均点>)
       cnt++;
       e.Graphics.DrawString(<学年全体の平均点>)
       cnt++;
    }

    2006年9月20日 4:52
  • HasMorePages = trueにすると、そこで改ページされるということではありません。もう一度、PrintPageイベントを起こしてね。と、お願いすることになります。つまり、1ページ毎にPrintPageイベントプロシージャで書き出していくことになります。

    今回の場合は、書きたい内容を全てstring配列に入れておき、それを順番に書いていった方が簡単だと思います。

    一例ですが、以下に示します。
    #頭の中で考えているだけなので、この通りでは動かないかもしれません。

    string [] arrStr に書きだしたい内容を全部入れておく。
    int pageCnt = 0; に、何ページまで印刷したかを覚えておく。

    private void printDocument1_PrintPage(object sender,
         System.Drawing.Printing.PrintPageEventArgs e)
    {
       lineCnt = 0;

       while (arrStrがある限り && lineCnt < 50)
       {
        arrStr[pageCnt * 50 + lineCnt]をDrawString
         lineCnt++;
       }

       if (arrStrを全部印刷してない)
       {
            pageCnt++;
        HasMorePges = true;
       }
       else
        HasMorePges = false;

    }

    2006年9月20日 7:32
    モデレータ
  •  trapemiya さんからの引用
    今回の場合は、書きたい内容を全てstring配列に入れておき、それを順番に書いていった方が簡単だと思います。

    trapemiyaさん,ありがとうございます。
    二つのもの「dataGridViewに表示されているデータ」と「平均点のデータ」を同じstring配列に入れるという理解でよろしいでしょうか。
    2006年9月20日 8:23
  •  zen73 さんからの引用

    二つのもの「dataGridViewに表示されているデータ」と「平均点のデータ」を同じstring配列に入れるという理解でよろしいでしょうか。

    はい、その通りです。印刷データをまとめて用意しておいて、それをまとめて印刷します。バッチ処理的になります。
    2006年9月20日 8:29
    モデレータ
  • ありがとうございました。
    平均点の表示の仕方が状況によって異なりましたので配列に収めるのに苦労しましたが,思い通りに印刷することができました。(印字位置や縦横罫線の位置調整が残っていますが)

    2006年9月21日 7:50