none
印刷時の不具合を解消する方策は? RRS feed

  • 質問

  • zen73です。みなさんのアドバイスのおかげで’ページ小計とそれの次頁への繰越’ができたのですが2つの不具合を解消できずに悩んでおります。

     

    ア [印刷プレビュー]画面で[印刷アイコン]をクリックすると,直ちに印刷が始まってしまいますが,[印刷設定画面]を表示して’印刷枚数の設定’などができるようにしたい。

     

    イ フォーム上に私が設定した[印刷ボタン]をクリックすると[印刷プレビュー]画面が表示されますが,このとき印刷プレビュー画面の[閉じるボタン]でプレビュー画面を閉じた後に再度[印刷プレビュー]画面を表示すると,わずか2ぺーじのはずなのに200ページ以上も読み込んでエラーになってしまい続けての印刷ができません。

     

    private void btnPrint_Click(object sender, EventArgs e)
    {

       //------------------------------------------------------------

       PrintPreviewDialog prv = new PrintPreviewDialog();
       prv.Document = printDocument1;
       prv.Width = 500;
       prv.Height = 500;
       prv.ShowDialog();
    }

     

    private void printDocument1_PrintPage(object sender,

         System.Drawing.Printing.PrintPageEventArgs e)
    {

    //----------------------------------------------------------

    }

     

    private void printDocument1_BeginPrint(object sender,

                 System.Drawing.Printing.PrintEventArgs e)
    {
         rnum = 0;   
    }

     

     

    2007年10月19日 0:54

回答

  • ざっと見たところ、idxがbtnPrint_Click内で初期化されていません。 1度目はうまくいっても2度目がうまくいかないのですから、1度目の結果を引きずっているということですので、変数などの初期化に注目されるとよいと思います。

    rowCntで印刷の終わりを判断されているため、この値が正しいかをまずデバッガで確かめましょう。ブレークポイントで止めてその値をチェックするだけで十分です。

    2007年10月19日 7:23
    モデレータ

すべての返信

  • アについては以前も話題になりましたね。

     

    PrintDocument等の使い方
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=736320&SiteID=7

     

    イについては問題切り分けて絞り込んで突き止めるしかないです。まず、2回目も配列が正しく用意されているのか? そうであればBeginPrintでの処理に問題がありそうですので、デバッガで追ってみるなどです。いずれにしてもたぶんコード上のバグっぽいので、この場合はzen73さんが突き止めるしかありません。

    その結果、どうしてもわからなければコードを載せて下さい。

    2007年10月19日 2:40
    モデレータ
  •  trapemiya さんからの引用

    アについては以前も話題になりましたね。

    私もほんとうに呆けてしまっていますね。あのときは,せっかくアドバイスをいただきながらも実現できずに諦めてしまったのでした。

     trapemiya さんからの引用

    まず、2回目も配列が正しく用意されているのか?

    このことについては,まったく意識しておりませんでした。

    どこに,どのように書くといいのか,お教え願えませんでしょうか。

     

    コード ブロック

    public partial class frm2SuitoPrt : Form
    {
        //印刷データ
       private string[,] hyoji = new string[500, 9];
        private int rowCnt = 0;
        private int page = 1;
        //改ページ変数
        int rnum;
        int maxRow = 20;
        int idx = 0;

        private int[] sLen = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        private int[] sum = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };

     

        public frm2SuitoPrt()
        {
            InitializeComponent();
        }

     

        private void frm2SuitoPrt_Load(object sender, EventArgs e)
        {
            // データを 'suitoPrtDataSet.suito' テーブルに読み込む。
            this.suitoTableAdapter.Fill(this.suitoPrtDataSet.suito);
        }

     

        private void setArray(int i)
        {
            hyoji[i + idx + 1, 0] = "";
            hyoji[i + idx + 1, 1] = "";
            hyoji[i + idx + 1, 2] = "";
            hyoji[i + idx + 1, 3] = "";
            hyoji[i + idx + 1, 4] = "次頁へ繰越";
            hyoji[i + idx + 1, 5] = "小計";
            hyoji[i + idx + 1, 6] =

                sum[6].ToString("#,###").PadLeft(10);
            hyoji[i + idx + 1, 7] =

                sum[7].ToString("#,###").PadLeft(10);
            hyoji[i + idx + 1, 8] =

                (sum[6] - sum[7]).ToString("#,###").PadLeft(10);
            hyoji[i + idx + 2, 0] = "";
            hyoji[i + idx + 2, 1] = "";
            hyoji[i + idx + 2, 2] = "";
            hyoji[i + idx + 2, 3] = "";
            hyoji[i + idx + 2, 4] = "前頁より繰越";
            hyoji[i + idx + 2, 5] = "";
            hyoji[i + idx + 2, 6] =

                sum[6].ToString("#,###").PadLeft(10);
            hyoji[i + idx + 2, 7] =

                sum[7].ToString("#,###").PadLeft(10);
            hyoji[i + idx + 2, 8] =

                (sum[6] - sum[7]).ToString("#,###").PadLeft(10);
        }


        private void setHyoji(int i, int j)
        {
            int iVal;
            if (suitoDataGridView[j + 1, i].Value != DBNull.Value)
            {
                iVal = Convert.ToInt32(

                           suitoDataGridView[j + 1, i].Value);
                hyoji[i + idx, j]

                    = iVal.ToString("#,###").PadLeft(10);
                sum[j] += iVal;
            }
            else
            {
                hyoji[i + idx, j]

                    = suitoDataGridView[j + 1, i].Value.ToString();
            }
        }


        private void leftPad(int i, int j)
        {
            hyoji[i + idx, j]

                = suitoDataGridView[j + 1, i].Value

                                            .ToString().PadLeft(2);
        }


        private void btnPrint_Click(object sender, EventArgs e)
        {
            int i;
            int num;
            Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
            rowCnt = suitoDataGridView.RowCount - 1;
            for (i = 0; i < rowCnt; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    switch (j)
                    {
                        case 0:
                            leftPad(i, j);
                            break;
                        case 1:
                            leftPad(i, j);
                            break;
                        case 6:
                        case 7:
                        case 8:
                            setHyoji(i, j);
                            break;
                        default:
                            hyoji[i + idx, j]

                            = suitoDataGridView[j + 1, i].Value

                                                        .ToString();
                            break;
                    }
                    //文字列の長さ(Byte単位)
                    num = sjisEnc.GetByteCount(hyoji[i + idx, j]);
                    if (sLen[j] < num) sLen[j] = num;
                }

                if (i != 0 && (i % (maxRow - 2) == 0))
                {
                    setArray(i);
                    idx += 2;
                }
            }
            hyoji[i + idx, 0] = "";
            hyoji[i + idx, 1] = "";
            hyoji[i + idx, 2] = "";
            hyoji[i + idx, 3] = "";
            hyoji[i + idx, 4] = "合 計";
            hyoji[i + idx, 5] = "";
            hyoji[i + idx, 6] = sum[6].ToString("#,###").PadLeft(10);
            hyoji[i + idx, 7] = sum[7].ToString("#,###").PadLeft(10);
            hyoji[i + idx, 8]

                   = (sum[6] - sum[7]).ToString("#,###").PadLeft(10);
            //増やした列数
            rowCnt += idx + 1;

            PrintPreviewDialog prv = new PrintPreviewDialog();
            prv.Document = printDocument1;
            prv.Width = 500;
            prv.Height = 500;
            prv.ShowDialog();
        }

        private void printDocument1_PrintPage(object sender,

                System.Drawing.Printing.PrintPageEventArgs e)
        {
            //標題
            string title = "出 納 帳";

            //フォント
            Font f = new Font("MS ゴシック", 11);
            int x = 50, y = 90;         //印刷開始位置
            int pitch = f.Height + 3;   //行ピッチ
            int Apage;                  //ページ番号
            int cnt = 0;                //印刷開始行
            //-----表罫線-------------------------------
            int topX = x;
            int topY;
            int[] moveX = new int[9];   //縦罫線の位置
            int[] moveS = new int[9];   //文字列の位置
            moveX[0] = x;
            moveX[1] = moveX[0] + 23;
            moveX[2] = moveX[1] + 23;
            moveX[3] = moveX[2] + sLen[2] * 9;
            moveX[4] = moveX[3] + sLen[3] * 9;
            moveX[5] = moveX[4] + sLen[4] * 9;
            moveX[6] = moveX[5] + 46;
            moveX[7] = moveX[6] + 88;
            moveX[8] = moveX[7] + 88;
            int rectWidth = moveX[8] + 38;
            int leftX = topX + rectWidth;
            int rectHeight;
            int botomY;
            for (int i = 0; i < 9; i++)
            {
                moveS[i] = moveX[i] + 2;
            }
            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,

                                                 leftX - 138, 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, leftX - 55, y - 35);

            //見出し
            f = new Font("MS ゴシック", 11);
            for (int i = 0; i < 9; i++)
            {
                e.Graphics.DrawString(head[i],

                                      f, Brushes.Black, moveS[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;

            f = new Font("MS 明朝", 11);
            //rowCnt += 2;
            do
            {
                if (rnum <= rowCnt)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        e.Graphics.DrawString(hyoji[rnum, i], f,

                            Brushes.Black, moveS[i], y + cnt * pitch);
                    }
                    //下に横罫線
                    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;
        }
    }

     

     

    2007年10月19日 5:17
  • ざっと見たところ、idxがbtnPrint_Click内で初期化されていません。 1度目はうまくいっても2度目がうまくいかないのですから、1度目の結果を引きずっているということですので、変数などの初期化に注目されるとよいと思います。

    rowCntで印刷の終わりを判断されているため、この値が正しいかをまずデバッガで確かめましょう。ブレークポイントで止めてその値をチェックするだけで十分です。

    2007年10月19日 7:23
    モデレータ
  • trapemiyaさん,ありがとうございました。trapemiyaさんは私にとって救いの神とでも言うべき存在のお方で感謝の気持ちでいっぱいです。それにしてもidxの初期化が問題だったとは。自分自身で気付くべき問題でしょうね。ちょっと自分自身情けない気がします。

    btnPrint_Clickでidx=0としたところ不具合が完全に解消されました。

    アについては,今になってようやっとPrintPreviewControlにボタンをつけることが少しはイメージできるようになりましたので何とかやってみます。

     

    ほんとうにありがとうございました。

     

    2007年10月19日 9:02