0

会社のロゴを含む Windows フォームと、一連のレコード (例: 200 レコード) をリストするグリッドビューと、その下にテキスト ボックスとラベルのセットがあります。

すべてを印刷する方法はありますか。つまり、gridview レコードとテキスト ボックスとラベルを含むロゴはありますか?

ありがとう。

4

1 に答える 1

2

はい、これは可能です。正しい方向に進むには、まずフォームにPrintDocumentをドロップし、BeginPrintイベントとPrintPageイベントを接続する必要があります。これを機能させるには、印刷ではなくプレビューを印刷する必要があるため、DocumentプロパティがPrintDocumentを指すPrintPreviewDialogも必要になります。次に、以下を呼び出して、印刷プレビューを表示できます。

    printPreviewDialog1.ShowDialog();

私は既存のアプリケーションから以下のコードを掘り出しました。

BeginPrintハンドラーでは、グリッドの全幅を計算して、印刷時にそれに応じて拡大縮小できるようにする必要があります。

    totalWidth = 0;
    foreach (DataGridViewColumn col in dataGridView1.Columns)
      totalWidth += col.Width;

PrintPageハンドラーでは、最初に、以下のコードの行に沿って列見出しを印刷する必要があります。このコードをメインループ(下記)に含めて、すべてのページに列見出しを印刷することをお勧めします。

      foreach (DataGridViewColumn col in dataGridView1.Columns)
      {
        e.Graphics.DrawString(col.HeaderText,
            col.InheritedStyle.Font,
            new SolidBrush(col.InheritedStyle.ForeColor),
            new RectangleF(l, t, w, h),
            format);
      }

次に、各行を印刷できます。

    while (row <= dataGridView1.Rows.Count - 1)
    {
      DataGridViewRow gridRow = dataGridView1.Rows[row];
      {
        foreach (DataGridViewCell cell in gridRow.Cells)
        {
          if (cell.Value != null)
          {
            if (cell is DataGridViewTextBoxCell)
              e.Graphics.DrawString(cell.Value.ToString(),
                  cell.InheritedStyle.Font,
                  new SolidBrush(cell.InheritedStyle.ForeColor),
                  new RectangleF(l, t, w, h),
                  format);
            else if (cell is DataGridViewImageCell)
              e.Graphics.DrawImage((Image)cell.Value,
                  new RectangleF(l, t, w, h));
          }
        }
      }
      row++;
    }

注意すべきいくつかのこと:

  • イベントハンドラは、ページごとに呼び出されます。ページがいつ終了するかを決定し、必要に応じて戻る必要がありe.HasMorePages = trueます。変数「row」は、次のページでどの行から開始するかを知るために使用されます。セルの境界線を印刷することをお勧めします
  • 印刷する長方形を追跡する必要があります(上記では「l、t、w、h」を参照しました)。これにより、印刷される列ごとに左側が調整され、印刷される行ごとに上部が調整されます。e.MarginBounds.Width / totalWidthまた、これは、各セルをスケーリングするためにセル幅を乗算する場所です。
  • 画像のアスペクト比を維持するために、上記のことは何もしていません。

お役に立てれば。

于 2012-07-03T01:03:19.353 に答える