読者です 読者をやめる 読者になる 読者になる

WindowsForms DataGridView コントロール上でのタッチ操作について

Windows FormsのDataGridViewはタッチ操作(フリック、スワイプっていうらしい)でのスクロールに不具合があります。
もうWindows Formsのバグは修正してくれないので回避コードでいくしかないようです。

DataGridView コントロール上でのタッチ操作について – Visual Studio サポート チーム blog

回避コード

private const int WM_VSCROLL = 0x0115;
private const int SB_THUMBPOSITION = 0x0004;
private const int SB_THUMBTRACK = 0x0005;
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

public class MyDataGridView : DataGridView {
  // メッセージを処理します。
  protected override void WndProc(ref Message m){
    base.WndProc(ref m);

    if (m.Msg == WM_VSCROLL){
      if (LoWord((long)m.WParam) == LoWord((long)SB_THUMBPOSITION)){
        BeginInvoke((Action<IntPtr, IntPtr>)((WParam, LParam) => {
          // SB_THUMBPOSITION を SB_THUMBTRACK に変更します。
          IntPtr testWParam = new IntPtr(SB_THUMBTRACK);
          // WM_VSCROLL メッセージを再送します。
          PostMessage(this.Handle, WM_VSCROLL, testWParam, LParam);
        }), m.WParam, m.LParam);
      }
    }
  }
}

WindowsFormsでタッチ操作は正直限界だと思う。

そしてこの一文

※ 上記回避方法については、お客様において十分にご確認、ご検証くださいますようお願いします。

バグ直せや

参考URL:
Windows 8 でタッチ操作でグリッドをスクロールしたときに描画がズレる。(最後が隠れる) - Microsoft.NET - Project Group
Windows8でデータグリッドビューをタッチ操作するとスクロールバーと描画内容がずれる
Windows8 対応タッチパネルでDataGridViewコントロールによるタッチ操作でのMoseMoveイベントが発生しない。 | Microsoft Connect