VisualStudio2010 のVBを使っているのですが、
DataGridViewにあるデータを表示しています。
列は県名、市町村名、氏名 となっています。
表示の際に連続して同じ県名だった場合は線を表示せず、まとめた形で表示
させています。
ただ、これだと同じ県名のデータが100件あった場合に1番上の行にしか表示
されてないため、縦にスクロールすると、県名が見えなくなってしまいます。
スクロールしたときに表示上の1番上の行には常に県名を表示させるような
ことは無理でしょうか?
ちなみに
http://www.atmarkit.co.jp/fdotnet/dotnettips/593dgvgroupedcell/dgvgroupedcell.htmlの記事を参考に作成しました。
よろしくお願いいたします。
> 表示の際に連続して同じ県名だった場合は線を表示せず、まとめた形で表示させています。
恐らくは、CellFormatting あるいは CellPainting 等での処理で、
「上の行と同じ値なら表示しない」ための処理を書いているのですよね。
仮に CellFormatting 等で e.Value = "" で消すような実装だと、
データ編集時に困るかと思うので…CellPainting で自前描画でしょうか?
> スクロールしたときに表示上の1番上の行には常に県名を表示させるようなことは無理でしょうか?
手抜き実装で良ければ、その処理に対して
「ただし、一番上に見えている行の時はそのまま表示させる」
のようなコードを追加すればよいかと思います。
具体的には、
If DataGridView1.FirstDisplayedScrollingRowIndex = e.RowIndex Then
Return
End If
のような感じです。ただし、これだけではまだ不十分なので、さらに、
スクロール時に先頭行を再描画させるため、Scroll イベントや編集時等に、
DataGridView1.Invalidate() を呼び出し、全体を強制的に再描画させます。
なお、もしも全体を Invalidate するとパフォーマンス上の問題が
生じる場合は、スクロール前後の FirstDisplayedScrollingRowIndex や
編集した行の前後のデータを判断して、該当行のみを InvalidateRow
するなどして、再描画の範囲を狭めるようにして対処してみてください。
アドバイスありがとうございます。
CellPainting 時に一番上の行は描画する条件を追加しまして、
あと、Scrollイベント時に再描画することで実現しました。
今のところ全体をInvalidateして問題ないようですが、データ量が少ないサンプルしかないので、サンプルデータを増やして実験してみたいと思います。
ツイート | ![]() |