DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33159 / inTopicNo.1)  DataGridView CellPainting処理での、ちらつき残像について
  
□投稿者/ Gotou 一般人(1回)-(2015/10/27(Tue) 12:01:27)
  • アイコン環境/言語:[Windows7 SP1 c# Visual Studio Community 2013] 
    分類:[.NET] 

     はじめまして。
    DataGridViewについて質問させてください。
    DOBON.NETさんの記事を参考にして、DataGridViewのカレントセルを強調させるため
    CellPaintingイベントハンドラで、セル枠を黒の太線表示にする処理を書いてみました。

    思い通りの表示にはなったのですが、データ数が多いときにマウスドラックの
    オートスクロール動作(キーボード shift + 上下左右矢印キーのオートスクロール動作)時にカレントセル枠がちらつきます。
    カレントセル枠が、2つ見えるような残像です。

    もしかして、PCの性能が関係しているのかもしれませんが必要最小限のコードを
    載せますので、アドバイス、ヒントでも良いので教えてもらえないでしょうか
    よろしくお願いします。

    検証のための必要最小限のコード

    Windows7 SP1 c# Visual Studio Community 2013

    フォームにDataGridViewを1つDock = Fillで、配置します。

    public Form1()
    {
    InitializeComponent();

    typeof(DataGridView)
          .GetProperty("DoubleBuffered",
    System.Reflection.BindingFlags.Instance |
    System.Reflection.BindingFlags.NonPublic)
          .SetValue(dataGridView1, true, null);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    for (int i = 0; i < 50; i++)
    {
    dataGridView1.Columns.Add("", "Column" + (i + 1).ToString());
    }

    for (int i = 0; i < 1000; i++)
    {
    dataGridView1.Rows.Add();
    }
    }

    private void dataGridView1_CellPainting(object sender,
    DataGridViewCellPaintingEventArgs e)
    {
    DataGridView dgv = (DataGridView)sender;

    if (dgv.CurrentCell.ColumnIndex == e.ColumnIndex &&
    dgv.CurrentCell.RowIndex == e.RowIndex)
    {
    e.Paint(e.ClipBounds, e.PaintParts &
    ~DataGridViewPaintParts.SelectionBackground);

    e.Graphics.DrawRectangle(new Pen(Color.Black, 2),
    e.CellBounds.X + 1, e.CellBounds.Y + 1,
    e.CellBounds.Width - 3, e.CellBounds.Height - 3);

    e.Handled = true;
    }
    }

引用返信 削除キー/
■33160 / inTopicNo.2)  Re[1]: DataGridView CellPainting処理での、ちらつき残像について
□投稿者/ 魔界の仮面弁士 大御所(992回)-(2015/10/27(Tue) 16:48:37)
  • アイコン2015/10/27(Tue) 16:50:12 編集(投稿者)

    No33159に返信(Gotouさんの記事)
    > カレントセル枠が、2つ見えるような残像です。
    手持ちの PC では、残像はさほど強くなく、
    致命的に遅いようには見えませんでした。


    > アドバイス、ヒントでも良いので教えてもらえないでしょうか
    あまり有効なアドバイスでも無いですが:


    > private void Form1_Load(object sender, EventArgs e)
    検証用に行・列を用意するのなら、
     dataGridView1.ColumnCount = 50;
     dataGridView1.RowCount = 1000;
    だけで良いと思います。



    > if (dgv.CurrentCell.ColumnIndex == e.ColumnIndex &&
    > dgv.CurrentCell.RowIndex == e.RowIndex)
    こういう場合には、
     var currentXY = dgv.CurrentCellAddress;
     if (currentXY.X == e.ColumnIndex && currentXY.Y == e.RowIndex)
    とします。
    https://msdn.microsoft.com/ja-jp/library/ha5xt0d9.aspx


    > new Pen(Color.Black, 2)
    Pen は IDisposable なので、Dispose せずに
    延々と new し続けるべきではありません。イベントの都度 using するか、
    もしくは Load 時などに事前に生成しておいたものを使いまわし、
    画面終了時に Dispose するようにした方が良いでしょう。
引用返信 削除キー/
■33161 / inTopicNo.3)  Re[2]: DataGridView CellPainting処理での、ちらつき残像について
□投稿者/ Gotou 一般人(2回)-(2015/10/28(Wed) 00:39:32)
  • アイコン2015/10/28(Wed) 00:45:39 編集(投稿者)

    魔界の仮面弁士さん、返信ありがとうございます。
    検証のための必要最小限のコードなどと書いてしまい自分の知識のなさ勉強不足を反省しています。

    PenオブジェクトのDisposeやカレントセルの判定の部分は、作成中のプログラムを書き直しました。
    指摘していただきありがとうございました。

    魔界の仮面弁士さんの手持ちの PC では、残像はさほど強くなくとの事でしたが
    これはプログラムとしては、問題ない範囲なのでしょうか。

    自分の PC でもスクロールスピードは問題なく、ちらつきがはっきりしているのです。

    実は間違ったアプローチですが、CellPaintingイベントハンドラの最後で
    dataGridView1.Invalidate()を入れると、キーボード shift + 上下左右矢印キーの
    オートスクロール動作時は、ちらつきが消えます。
    ただし起動時、スクロールバーの表示は乱れマウスドラックのオートスクロール動作は
    途中で出来なくなります。
    CellPaintingイベントハンドラが、呼び続けられている状態です。

    この辺に関しては、何かありますでしょうか。

    改善できない場合は、SelectionModeをFullRowSelectにMultiSelectをFalse変更して
    対処したいと思います。


引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -