none
XpでDataGridViewのスクロールバーの上下ボタンをダブルクリック連打するとおかしくなる RRS feed

  • 質問

  • Visual Studio 2008 STDでプログラムしています。

    タイトルのように、Windows XpでDataGridViewのスクロールバーの
    上下ボタンをダブルクリックで連打すると、ボタンが消えます。
    Vistaではこの症状は出ません。
    いったん、ボタンが消えると、スクロールバーをドラッグしたりすると、
    スクロールバーの■の大きさが大きくなったり、小さくなったりします。

    Word Wrap の指定を変えたりといろいろなところを変えて実験しまし
    たが、Xpではその症状を改善することができませんでした。

    2006年に似たような症状があるのを見ましたが、解決されていません。
    どなたか、ご存じないでしょうか?
    2010年3月2日 13:46

回答

  • こちらのブログで書かれている、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
    2010年3月10日 8:59

すべての返信

  • GpH2さん、こんにちは。

    こちらでも試してみたのですが、同じような現象を確認することができませんでした。
     開発環境:Windows7+VS2008(SP1)
     確認環境:WindowsXP(SP3)+.NET Framework3.5(SP1)

    同じアプリケーションを他のXPマシンで実行しても、同じような現象が再現されるのでしょうか?

    もし、同じような現象を再現した方がいらっしゃいましたら、
    ご報告の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年3月9日 10:02
  • 高橋様

    どうもすみません。

    自分も実験してみたのですがフォームにDataGridViewを貼り付けただけではOKでした。

    症状が出たのは、(私の場合)タイマーで一定時間ごとにモジュールを実行している間に出ることが
    わかりました。

    どのような処理かと言いますと、画像データのアルファチャンネルの値を少しずつ変えて表示するというものです。

    何かのリソースが足りなくなる…というようなことがXpの場合ありますでしょうか?

    画像をアップできればどんな感じかが分かっていただけるかなーと思うのですが…

    2010年3月9日 14:03
  • こちらのブログで書かれている、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
    2010年3月10日 8:59
  • TH01 様

    症状例と実際のコードまで書いていただき、ありがとうございました。

    早速、Xpのスクロールバー対策として導入し、Xpで改善されることが分かりました。

    また、Application_Idle_ForRepairGridScrollBarというのも初めて知りました。
    後々、色々なところで活用できるのでは…と思っています。

    本当にありがとうございました。
    2010年3月11日 15:56