none
印刷プレビューから戻ったとき? RRS feed

  • 質問

  • 印刷プレビューから印刷を中止して戻ったとき,カーソルのあったdataGridViewのセルに「印刷プレビューの画像」が残って表示されています。これを表示させない方法をお教えいただきたいのですが。

    dataGridViewのセル→[       ]
                       ↑
                     ここに,このセルと重なった「印刷プレビューの画像」の一部が表示される

     


    zen73
    2010年10月27日 2:31

回答

  • 不思議としか言いようがないのですが・・・。

    TH01さんが教えてくださった Form1_Activated を試してみようと思い,その前に現状を確認しておこうとしたところ「お尋ねした異状」が表出されることはありませんでした。なにか狐につままれた感じです。
    その後毎日のように確認していたのですが結果はやはり正常です。

    <何か手を加えたのか?>
    VSのIDEで一点だけ気になっていたことがありましたので,変更したところがあります。

    <気になったこと>
    Formのデザイナを表示するとき,左側に「ツールボックス」を表示したままの時,表示するForm上のコントロールを配置したところがすべて窓が開いたように表示されて,正常に表示されるまでには少なくとも3秒くらいはかかってしまっていました。

    <対処したこと>
    それで,「コントロールボックス」を表示しない(必要な時だけ表示する)ようにしたところ,3秒もの時間がかかることなく,あっという間に表示されるようになりました。

    <不具合の原因と思われること>
    見当違いだとは思うのですが,IDE自体になんらかの欠陥があるのではないか?と思ってしまいます。

    >すると、グラフィックやプリンタのドライバの影響の可能性は低く(確認しておいてすみません)

    いいえ,こちらこそ何時もわけのわからない質問にお答えいただいておりとても感謝しております。

     

     

     


    zen73
    • 回答としてマーク zen73 2010年10月31日 4:47
    2010年10月31日 4:36

すべての返信

  • DataGridViewのセルを独自に描画してたりするのでしょうか?

    Refresh や Update メソッドを使って DataGridView を再描画したらどうなりますか?


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月27日 4:12
  • なかむらさん,いつもありがとうございます。

    >DataGridViewのセルを独自に描画してたりするのでしょうか?
    いいえ,そのようなことはしておりません。

    >Refresh や Update メソッドを使って DataGridView を再描画したらどうなりますか?

    private void btnPrint_Click(object sender, EventArgs e)
    {
     System.Drawing.Printing.PrintDocument pd =
      new System.Drawing.Printing.PrintDocument();
     pd.PrintPage +=
      new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage);
     PrintDialog pdlg = new PrintDialog();
     pdlg.Document = pd;
     if (pdlg.ShowDialog() == DialogResult.OK)
     {
      pd.Print();
     }
    }
    
    

    Refreshメソッドを使用してみたいと思っています。どこに書くのがよいのでしょうか? 集計表(決算報告書)ですので,Updateは使用できません。

     


    zen73
    2010年10月27日 4:44
  • 下記のように、PrintDialog を閉じた後に DataGridView を再描画してみてください。

    if (pdlg.ShowDialog() == DialogResult.OK)
    {
      pd.Print();
    }
    
    // DataGridView を再描画する
    dataGridView.Refresh();
    

    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月27日 8:55
  • Refresh() を実行してみたのですが,状況は変わりませんでした。

    「印刷プレビュー」は,Canonのプリンターで「印刷前にプレビューを表示」にチェックを入れて表示しております。ここから「中止」「印刷」どちらを実行しても,dataGridViewのセルに「印刷プレビューの画像」が残って表示されます。

    Visual Studioを起動し「最近使用したプロジェクト」の一覧から選択してクリックボタンを押したとき,IDEが完全に表示される途中に,フォームのコントロールの部分に一時的ではありますけど,コントロールが窓のようになってVSの画像がみえています。私のPCの固有の現象なのでしょうか。

    追記:データセットをバインドしたdataGridViewげはこのような現象は起こっておりません。


    zen73
    2010年10月27日 19:02
  • OSやプリンタの機種はなんでしょうか?
    問題の切り分けとして、新規作成した単純なプロジェクトでも同じ現象が発生するか試してもらえますでしょうか?

    たとえば新規プロジェクトのコードを以下に差し替えてもらい、「テスト」ボタンを押してプレビュー(プリンタの機能)を表示して閉じると、グリッドのセルが黒くなっちゃったりするのでしょうか?
    もしそうなる場合は、プレビューを閉じた後に「再描画」ボタンを押すと表示は正常に戻りますでしょうか?

    (注意点)
    ※PrintDialog は表示していませんので、事前に対象のプリンタを「通常使うプリンタ」に設定しておいてください。
    ※実際に印刷すると黒インクをたくさん使っちゃうので、テストではプレビューだけにしてください(このコードにはプレビュー処理はありませんので、プリンタのプレビュー機能を有効にしておいてください)。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.StartPosition = FormStartPosition.CenterScreen;

            var grid = new DataGridView();
            grid.ColumnCount = 3;
            grid.RowCount = 5; // バインドじゃない。
            grid.Dock = DockStyle.Fill;
            this.Controls.Add(grid);

            var button1 = new Button();
            button1.Text = "テスト!";
            button1.Click += (s, e) =>
            {
                var pd = new System.Drawing.Printing.PrintDocument();
                pd.PrintPage += (s2, e2) =>
                {
                    // 用紙いっぱい、真っ黒。
                    e2.Graphics.FillRectangle(Brushes.Black, e2.PageBounds);
                };
                pd.Print();
            };
            this.Controls.Add(button1);
            button1.BringToFront();

            var button2 = new Button();
            button2.Text = "再描画";
            button2.Left = button1.Right;
            button2.Click += (s, e) => { this.Refresh(); };
            this.Controls.Add(button2);
            button2.BringToFront();
        }
    }

    他には、グラフィックドライバの問題やプリンタドライバの問題の可能性もあるので、もしかするとそれらを最新のものにすると直ったりするかもしれませんね。

    2010年10月29日 2:43
  • >OSやプリンタの機種はなんでしょうか?
       OS; XP-Pro(sp3)
       プリンタ: Canon MP810
       グラフィックカード: GIGABYTE GV-NX85T512HP(性能は低いほうです) 

    >「テスト」ボタンを押してプレビュー(プリンタの機能)を表示して閉じると、グリッドのセルが黒くなっちゃったりするのでしょうか?
       黒くはなりませんでした。


    zen73
    2010年10月29日 6:36
  • > 黒くはなりませんでした。

    すると、グラフィックやプリンタのドライバの影響の可能性は低く(確認しておいてすみません)、書かれてるコードの何かが災いしているのかもしれないですね。
    大変でしょうけど、処理を少しずつコメントにするなどして地道に原因を特定するしかないと思います(私はよくします)。

    もしかして今回の話も、これまでのスレッドでの
    ・フリーズすることがある。
    ・日本語入力ができなくなる場合がある。
    と同じプロジェクトでしょうか。
    原因の特定と対処ができると、全部一気に解決したりしないでしょうかね。

    対処療法として、以下を行うと改善しないでしょうか?

    // フォームの Activated イベントに割り当ててください。
    private void Form1_Activated(object sender, EventArgs e)
    {
        対象のグリッド.Invalidate(); // または Refresh
    }

    2010年10月29日 10:27
  • 不思議としか言いようがないのですが・・・。

    TH01さんが教えてくださった Form1_Activated を試してみようと思い,その前に現状を確認しておこうとしたところ「お尋ねした異状」が表出されることはありませんでした。なにか狐につままれた感じです。
    その後毎日のように確認していたのですが結果はやはり正常です。

    <何か手を加えたのか?>
    VSのIDEで一点だけ気になっていたことがありましたので,変更したところがあります。

    <気になったこと>
    Formのデザイナを表示するとき,左側に「ツールボックス」を表示したままの時,表示するForm上のコントロールを配置したところがすべて窓が開いたように表示されて,正常に表示されるまでには少なくとも3秒くらいはかかってしまっていました。

    <対処したこと>
    それで,「コントロールボックス」を表示しない(必要な時だけ表示する)ようにしたところ,3秒もの時間がかかることなく,あっという間に表示されるようになりました。

    <不具合の原因と思われること>
    見当違いだとは思うのですが,IDE自体になんらかの欠陥があるのではないか?と思ってしまいます。

    >すると、グラフィックやプリンタのドライバの影響の可能性は低く(確認しておいてすみません)

    いいえ,こちらこそ何時もわけのわからない質問にお答えいただいておりとても感謝しております。

     

     

     


    zen73
    • 回答としてマーク zen73 2010年10月31日 4:47
    2010年10月31日 4:36