DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ListViewのグリッド線の乱れ。

環境/言語:[XP VB.NET]
分類:[.NET]

いつもお世話になっています。

ListViewの列データが多い場合、
水平スクロールバーが表示されます。

そのバーをスライドさせると
グリッド線が乱れている、というか
余計な線が表示されていたり
といった現象が起きてしまいます。
その乱れは、いずれかの行を選択状態にすると
正常な表示位置になるようなのですが。

この状況を回避できる方法がありましたら
どうぞ教えていただけませんでしょうか?
よろしくお願いします。
Framework3.5までは発生してしまうようです。4.0は確かめていないので分かりません。

回避策としてはGridを自分で引くかListViewを用いないでDataGridViewを使用するなどかな。余力があればコントロールをリスト表示するコントロールを作ってみるのもよいのではないでしょうか。
shuさん、ありがとうございます。

> 回避策としてはGridを自分で引くか
OwnerDrawにて引いているのですが、
ListViewの左端から列数でループを回して
列幅毎にグリッドを描画していました。
すなわち、右にスクロールしても
再描画されてしまうと
1列目の幅の位置で線、2列目の幅の位置で線…
となってしまっていました。
それで表示されている列ヘッダとラインがずれていたのでした。

これ以外の自分でGridを引く方法があれば
教えていただきたいのですが。

>余力があればコントロールをリスト表示するコントロールを作ってみる
すみません、想像すら出来ませんでした。
例えばどんなものをイメージされているのかを
参考に教えていただけませんでしょうか?

引き続きよろしくお願いします。
> OwnerDrawにて引いているのですが、
> ListViewの左端から列数でループを回して
> 列幅毎にグリッドを描画していました。
> すなわち、右にスクロールしても
> 再描画されてしまうと
> 1列目の幅の位置で線、2列目の幅の位置で線…
> となってしまっていました。
> それで表示されている列ヘッダとラインがずれていたのでした。
スクロール量を足した位置から書かないと駄目です。スクロール量はAPIで取ることが出来ると思いますが、プロパティなどには用意されていないようです。

> >余力があればコントロールをリスト表示するコントロールを作ってみる
> すみません、想像すら出来ませんでした。
> 例えばどんなものをイメージされているのかを
> 参考に教えていただけませんでしょうか?
業務では使ってますがソース公開をするわけにはいかないのでイメージだけ。パネルの中に動的にコントロールをずらずらと並べます。ただし表示領域外まで無尽蔵に作ってしまうと遅くなるのでスクロールに合わせて表示データを切り替えます。
shuさん、ありがとうございます。

> スクロール量を足した位置から書かないと駄目です。
Declare Function GetScrollPos Lib "User32" _
(ByVal hWnd As IntPtr, ByVal nbar As Int16) As Integer
Const SB_HOZ As Integer = 0
Const SB_VRT As Integer = 1


Dim sPos As Integer
sPos = GetScrollPos(Me.Handle, SB_HOZ)
でWinAPIにてスクロール量を取得し、
その値を考慮しながらループを回して
無事、期待通りの動作を確認できました。

勉強になりました。
また質問させてください。
ありがとうございました、閉じます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板