DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[
最新記事及び返信フォームをトピックトップへ
]
[ トピック内全3記事(1-3 表示) ] <<
0
>>
■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/
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-