DataGridViewをまとめて表示させた時の問題

解決


PS  2012-06-22 19:51:33  No: 147656  IP: 192.*.*.*

VisualStudio2010 のVBを使っているのですが、
DataGridViewにあるデータを表示しています。
列は県名、市町村名、氏名  となっています。

表示の際に連続して同じ県名だった場合は線を表示せず、まとめた形で表示
させています。

ただ、これだと同じ県名のデータが100件あった場合に1番上の行にしか表示
されてないため、縦にスクロールすると、県名が見えなくなってしまいます。

スクロールしたときに表示上の1番上の行には常に県名を表示させるような
ことは無理でしょうか?

編集 削除
PS  2012-06-22 19:53:23  No: 147657  IP: 192.*.*.*

ちなみに
http://www.atmarkit.co.jp/fdotnet/dotnettips/593dgvgroupedcell/dgvgroupedcell.htmlの記事を参考に作成しました。

よろしくお願いいたします。

編集 削除
魔界の仮面弁士  2012-06-22 22:08:21  No: 147658  IP: 192.*.*.*

> 表示の際に連続して同じ県名だった場合は線を表示せず、まとめた形で表示させています。

恐らくは、CellFormatting あるいは CellPainting 等での処理で、
「上の行と同じ値なら表示しない」ための処理を書いているのですよね。
仮に CellFormatting 等で e.Value = "" で消すような実装だと、
データ編集時に困るかと思うので…CellPainting で自前描画でしょうか?


> スクロールしたときに表示上の1番上の行には常に県名を表示させるようなことは無理でしょうか?

手抜き実装で良ければ、その処理に対して
「ただし、一番上に見えている行の時はそのまま表示させる」
のようなコードを追加すればよいかと思います。

具体的には、
  If DataGridView1.FirstDisplayedScrollingRowIndex = e.RowIndex Then
    Return
  End If
のような感じです。ただし、これだけではまだ不十分なので、さらに、
スクロール時に先頭行を再描画させるため、Scroll イベントや編集時等に、
DataGridView1.Invalidate() を呼び出し、全体を強制的に再描画させます。

なお、もしも全体を Invalidate するとパフォーマンス上の問題が
生じる場合は、スクロール前後の FirstDisplayedScrollingRowIndex や
編集した行の前後のデータを判断して、該当行のみを InvalidateRow 
するなどして、再描画の範囲を狭めるようにして対処してみてください。

編集 削除
PS  2012-06-25 09:01:40  No: 147659  IP: 192.*.*.*

アドバイスありがとうございます。
CellPainting 時に一番上の行は描画する条件を追加しまして、
あと、Scrollイベント時に再描画することで実現しました。

今のところ全体をInvalidateして問題ないようですが、データ量が少ないサンプルしかないので、サンプルデータを増やして実験してみたいと思います。

編集 削除