トップ回答者
DataGridViewの内容を印刷するとき

質問
-
こんにちは,zen73です。DatagridViewの内容を印刷するとき,次の2つのことを実現させたくてお尋ねします。
ア データを3桁区切りで印刷したい。
DataGridViewに3桁区切りで表示されているデータを,
hyoji[i, j] = suitoDataGridView[j + 1, i].Value.ToString();
と取り出して,
e.Graphics.DrawString(hyoji[rnum, i], f, Brushes.Black, moveX[ i ], y + cnt * pitch);
とPrintDocumentに書き出したとき,ここでは3桁区切りでは表示されません。そこでデータを取り出すときに次のようにしてみました。
hyoji[i, j] = Convert.ToInt32(suitoDataGridView[j + 1, i].Value).ToString("#,###");
これは,まったくの失敗でした。
イ printPreviewDialogの画面のサイズをあらかじめ指定して表示したい。
設定なしに表示させるとかなり小さなサイズで表示されていますが,画面のサイズを指定して表示することは可能なのでしょうか。
イはともかくアは是非にも実現させたいと思いますので,よろしくお願いします。
*DataDridViewの内容を印刷するコードはweb上ではほとんど見かけません。いつも質問に答えていただくばかりですので,もしやどなたかに役立てていただけたらと思い,コード(微調整を終えてはいませんが)をつけておきます。
コード ブロック//DataViewの設定
private DataView dvSuito = new DataView();
//印刷データ
private string[,] hyoji = new string[500, 9];
private int rowCnt = 0;
private int page = 1;
//改ページ変数
int rnum;private void btnPrint_Click(object sender, EventArgs e)
{
rowCnt = suitoDataGridView.RowCount - 1;
for (int i = 0; i < rowCnt; i++)
{
for (int j = 0; j < 9; j++)
{
//switch (j)
//{
//case 6:
//case 7:
//case 8:
// hyoji[i, j] = Convert.ToInt32(suitoDataGridView[j + 1, i].Value).ToString("#,###");
// break;
//default:
// hyoji[i, j] = suitoDataGridView[j + 1, i].Value.ToString();
// break;
hyoji[i, j] = suitoDataGridView[j + 1, i].Value.ToString();
//}
}
}
PrintPreviewDialog prv = new PrintPreviewDialog();
prv.Document = printDocument1;
prv.ShowDialog();
}private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//標題
string title = "出 納 帳";
//フォント
Font f = new Font("MS ゴシック", 10);
int x = 50, y = 90; //印刷開始位置
int pitch = f.Height + 3; //行ピッチ
int maxRow = 5; //1ページの行数
int Apage; //ページ番号
int cnt = 0; //印刷開始行
//-----表罫線-------------------------------
int topX = x - 5;
int topY;
int rectWidth = x + 650;
int rectHeight;
int botomY;
int leftX = topX + rectWidth;
int[] moveX = new int[] { 50, 80, 110, 200, 290, 460, 510, 580, 650,700 };
string[] head = new string[] { "月", "日", "大科目", "小科目", "摘要", "伝票", "入金", "出金", "残高" };
int lastMoneyLineY = 0;
//------------------------------------------
//下に罫線を引くときのペン
Pen underlinePen = new Pen(Color.Black, 0.3F);
//標題
e.Graphics.DrawString(title, f, Brushes.Black, x + 50, y - 27);
//日付
f = new Font("MS 明朝", 9);
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("ja-JP");
System.Globalization.DateTimeFormatInfo dtfi = ci.DateTimeFormat;
dtfi.Calendar = new System.Globalization.JapaneseCalendar();
System.DateTime dTime = System.DateTime.Now;
e.Graphics.DrawString(dTime.ToString("ggy年M月d日", dtfi), f, Brushes.Black, x + 415, y - 17);
//ページ番号
f = new Font("MS ゴシック", 10);
Apage = (rowCnt % maxRow == 0) ? rowCnt / maxRow : rowCnt / maxRow + 1;
e.Graphics.DrawString(page + "/" + Apage + "page", f, Brushes.Black, x + 468, y - 35);//見出し
f = new Font("MS ゴシック", 10);
for (int i = 0; i < 9; i++)
{
e.Graphics.DrawString(head[i], f, Brushes.Black, moveX[i], y);
}
//見出しの下の直線
int y1 = y + f.Height - 1;
int headlineY = y1;
e.Graphics.DrawLine(Pens.Black, topX, y1, leftX, y1);
y += pitch;
topY = y - pitch - 2;
lastMoneyLineY = topY;textBox1.Text = rnum.ToString();
f = new Font("MS 明朝", 10);
do
{
if (rnum < rowCnt)
{
for (int i = 0; i < 9; i++)
{
switch (i)
{
case 0:
case 1:
e.Graphics.DrawString(
hyoji[rnum, i].PadLeft(2) , f, Brushes.Black, moveX[i], y + cnt * pitch);
break;
case 6:
case 7:
case 8:
e.Graphics.DrawString(
hyoji[rnum, i].PadLeft(10), f, Brushes.Black, moveX[i], y + cnt * pitch);
break;
default :
e.Graphics.DrawString(hyoji[rnum, i], f, Brushes.Black, moveX[i], y + cnt * pitch);
break;
}
}
//下に横罫線
y1 = y + ((cnt + 1) * pitch) - 3;
e.Graphics.DrawLine(underlinePen, topX, y1, leftX, y1);
lastMoneyLineY = y1;
}//行番号の更新
rnum++;
cnt++;
//改ページの確認
if (cnt >= maxRow)
{
//枠罫線
rectHeight = pitch * (maxRow + 1) - 1;
e.Graphics.DrawRectangle(Pens.Black, topX, topY, rectWidth, rectHeight);
//縦罫線
botomY = topY + rectHeight;
for (int i = 0; i < 9; i++)
{
e.Graphics.DrawLine(underlinePen, moveX[i], topY, moveX[i], lastMoneyLineY);
}
e.HasMorePages = true;
page++;
break;
}
} while (rnum != rowCnt);
//最終ページの罫線
if (rnum == rowCnt)
{
//枠罫線
rectHeight = pitch * (rnum % maxRow + 1) - 1;
e.Graphics.DrawRectangle(Pens.Black, topX, topY, rectWidth, rectHeight);
//縦罫線
botomY = topY + rectHeight;
for (int i = 0; i < 9; i++)
{
e.Graphics.DrawLine(underlinePen, moveX[i], topY, moveX[i], lastMoneyLineY);
}
}
}private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
rnum = 0;
}
回答
-
こんにちわ。
<アについて>
こちらで以下のコードで確認したのですが、問題なく3桁カンマが付与されていました。
コード ブロックstring temp = Convert.ToInt32("20000000").ToString("#,###");
e.Graphics.DrawString(temp, base.Font, Brushes.Black, new PointF(40f, 40f));hyoji[i, j]にはきちんと3桁カンマが付与された形でデータが入っているのでしょうか。
もし入っているのであれば、3桁カンマつきで印刷されるはずです。
何かほかにhyoji[i, j]に格納した文字列に処理を行っていないか確認したほうがいいかもしれません。
<イについて>
PrintPreviewDialogのWidthプロパティとHeightプロパティを設定することで対応できると思います。
すべての返信
-
こんにちわ。
<アについて>
こちらで以下のコードで確認したのですが、問題なく3桁カンマが付与されていました。
コード ブロックstring temp = Convert.ToInt32("20000000").ToString("#,###");
e.Graphics.DrawString(temp, base.Font, Brushes.Black, new PointF(40f, 40f));hyoji[i, j]にはきちんと3桁カンマが付与された形でデータが入っているのでしょうか。
もし入っているのであれば、3桁カンマつきで印刷されるはずです。
何かほかにhyoji[i, j]に格納した文字列に処理を行っていないか確認したほうがいいかもしれません。
<イについて>
PrintPreviewDialogのWidthプロパティとHeightプロパティを設定することで対応できると思います。
-
Toshiさん,ありがとうございました。おかげさまで両方ともうまくいきました。
コード ブロックhyoji [i,j]=(suitoDataGridView [j+1,i].Value != DBNull .Value )?
Convert.ToInt32(suitoDataGridView[j + 1, i].Value).ToString("#,###")
: suitoDataGridView[j + 1, i].Value.ToString();PrintPreviewDialog prv = new PrintPreviewDialog();
prv.Document = printDocument1;
prv.Width = 500;
prv.Height = 800;
prv.ShowDialog();