トップ回答者
XpでDataGridViewのスクロールバーの上下ボタンをダブルクリック連打するとおかしくなる

質問
-
Visual Studio 2008 STDでプログラムしています。
タイトルのように、Windows XpでDataGridViewのスクロールバーの
上下ボタンをダブルクリックで連打すると、ボタンが消えます。
Vistaではこの症状は出ません。
いったん、ボタンが消えると、スクロールバーをドラッグしたりすると、
スクロールバーの■の大きさが大きくなったり、小さくなったりします。
Word Wrap の指定を変えたりといろいろなところを変えて実験しまし
たが、Xpではその症状を改善することができませんでした。
2006年に似たような症状があるのを見ましたが、解決されていません。
どなたか、ご存じないでしょうか?
回答
-
こちらのブログで書かれている、OS(Windows XP)の既知の問題が関係しているのかもしれません。
(無断リンクしてしまってすみません)
http://siranami73.yoka-yoka.jp/e105234.html
このフォーラムで以前にあった以下のスレッドについても、原因は同じなんだろうと思います。
DataGridView スクロール中の画面遷移(画面更新)
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/3195a753-cc39-480d-9a35-1ad157f4c19c
原因がもし同じ場合、以下のような対症療法で改善されないでしょうか?
再生成タイミングは Idle 時にしてみました。
(GpH2 さんはたぶん VB なのでコードは VB にしました。)Imports System.Reflection Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddHandler Application.Idle, AddressOf Application_Idle_ForRepairGridScrollBar End Sub Private _repairGridScrollBar As Boolean Private Sub DataGridView1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles DataGridView1.Scroll _repairGridScrollBar = True End Sub Private Sub Application_Idle_ForRepairGridScrollBar(ByVal sender As Object, ByVal e As EventArgs) 'Scroll の後の暇な時に修復する(修復が必要かは不明)。 If _repairGridScrollBar Then _repairGridScrollBar = False RepairGridScrollBar(DataGridView1) End If End Sub Private Sub RepairGridScrollBar(ByVal grid As DataGridView) For Each c As Control In grid.Controls If Not (TypeOf c Is ScrollBar) Then Continue For Dim type = c.GetType() Dim mi = type.GetMethod( _ "RecreateHandle", BindingFlags.Instance Or BindingFlags.NonPublic) If mi IsNot Nothing Then mi.Invoke(c, Nothing) Next End Sub End Class
- 回答としてマーク GpH2 2010年3月11日 15:56
すべての返信
-
こちらのブログで書かれている、OS(Windows XP)の既知の問題が関係しているのかもしれません。
(無断リンクしてしまってすみません)
http://siranami73.yoka-yoka.jp/e105234.html
このフォーラムで以前にあった以下のスレッドについても、原因は同じなんだろうと思います。
DataGridView スクロール中の画面遷移(画面更新)
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/3195a753-cc39-480d-9a35-1ad157f4c19c
原因がもし同じ場合、以下のような対症療法で改善されないでしょうか?
再生成タイミングは Idle 時にしてみました。
(GpH2 さんはたぶん VB なのでコードは VB にしました。)Imports System.Reflection Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddHandler Application.Idle, AddressOf Application_Idle_ForRepairGridScrollBar End Sub Private _repairGridScrollBar As Boolean Private Sub DataGridView1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles DataGridView1.Scroll _repairGridScrollBar = True End Sub Private Sub Application_Idle_ForRepairGridScrollBar(ByVal sender As Object, ByVal e As EventArgs) 'Scroll の後の暇な時に修復する(修復が必要かは不明)。 If _repairGridScrollBar Then _repairGridScrollBar = False RepairGridScrollBar(DataGridView1) End If End Sub Private Sub RepairGridScrollBar(ByVal grid As DataGridView) For Each c As Control In grid.Controls If Not (TypeOf c Is ScrollBar) Then Continue For Dim type = c.GetType() Dim mi = type.GetMethod( _ "RecreateHandle", BindingFlags.Instance Or BindingFlags.NonPublic) If mi IsNot Nothing Then mi.Invoke(c, Nothing) Next End Sub End Class
- 回答としてマーク GpH2 2010年3月11日 15:56