|
分類:[C#]
visual c# datagridviewの複数ページの印刷で困っています。プレビューでは1ページ目も2ページ目も3ページ目も表示されるのですが印刷ができません。
印刷、プレビューもform2に表示して作業していますが一回しか表示されず二回目は表示されません。form1に一旦切り替えてまたform2に戻ると表示されます。
環境はOSがvista ,visual c# 2010 proで,sqlserver2008またはaccess2000をdatabaseとして使用しています。
コードは以下の通りです。宜しくお願いします。
private void button2_Click(object sender, EventArgs e)//
{
// 用紙の向きを設定(横:true、縦:false)
using (PrintDocument printDocument1 = new PrintDocument())//doc
{
// 用紙の向きを設定(横:true、縦:false)
printDocument1.DefaultPageSettings.Landscape = true;//doc
// プリンタがサポートしている用紙サイズを調べる
foreach (PaperSize ps in printDocument1.PrinterSettings.PaperSizes)
{
// A4用紙に設定する
if (ps.Kind == PaperKind.A4)
{
printDocument1.DefaultPageSettings.PaperSize = ps;
break;
}
}
// PrintPage イベントハンドル追加
printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);
// ページ番号初期化
// プレビュー画面表示
using (PrintPreviewDialog previewDlog = new PrintPreviewDialog())
{
// 印刷ドキュメント指定
previewDlog.Document = printDocument1;
// 表示位置とサイズ設定
previewDlog.StartPosition = FormStartPosition.CenterScreen;
previewDlog.Size = new Size(800, 600);
// プレビュー画面表示
previewDlog.ShowDialog(this);
}
}
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//フォント
Font f = new Font("MS 明朝", 11);
//行ピッチ
int pitch = f.Height + 5;
//印刷開始位置
int x = e.MarginBounds.Top;
int y = e.MarginBounds.Left;
//1ページの行数
int PageLines = 20;//(e.MarginBounds.Height / pitch) - 0;
//フィールド名を印刷
e.Graphics.DrawString(
syuuriDataSet1.sekou.idColumn.ColumnName.PadRight(10) +
syuuriDataSet1.sekou.名前Column.ColumnName.PadRight(40) +
syuuriDataSet1.sekou.所属Column.ColumnName.PadLeft(5) + " " +
syuuriDataSet1.sekou.性別Column.ColumnName.PadRight(10, ' '),
new Font("MS ゴシック", 11), Brushes.Black,x, y);
//区切り線
y = y + pitch;
e.Graphics.DrawLine(Pens.Black, x, y, x + 650, y);
//-----
//印刷開始位置
y = y + pitch;
//印刷した行数
int cnt = 0;
//テーブルの内容を印刷
while (pos < syuuriDataSet1.sekou.Rows.Count)
{
//レコードが削除されているとき
if (syuuriDataSet1.sekou[pos].RowState == DataRowState.Deleted)
{
//レコード番号を更新
pos = pos + 1;
continue;
}
//1レコードを出力
e.Graphics.DrawString(
syuuriDataSet1.sekou[pos].id.ToString().PadRight(10) +
syuuriDataSet1.sekou[pos].名前.ToString().PadRight(20, ' ') +
syuuriDataSet1.sekou[pos].所属.ToString().PadLeft(5) + " " +
syuuriDataSet1.sekou[pos].性別.ToString().PadRight(10, ' '),
f, Brushes.Black, x, y + (pitch * cnt));
//レコード番号、印刷位置の更新
pos = pos + 1;
cnt = cnt + 1;
//改ページの確認
if (cnt >= PageLines)
{
e.HasMorePages = true;
break;
}
}
|