none
DataGridViewの動作とスクロール

    質問

  •  

    現在、DataGridViewを用いて情報表示するものを作成しています。

    表示したい情報は複数のクラスにて保持している状態でCellPaintイベントで全て描画しています。

    1回のマウスホイールで3行移動してしまい数回マウスホイールを動かすとScrollイベントが連続で

    発生しダラダラと描画しながら画面がスクロールしてしまいます。

     

    これを1回のマウスホイールで1行に制御できないものでしょうか?

     

     

     

    2007年9月1日 11:16

すべての返信

  • 実際に試した訳ではないのですが
    方針としてはDataGridViewの派生クラスを作り、
    OnMouseWheelをオーバーライドして動作を変えてやるんじゃないかと思います。

    2007年9月2日 2:39
  • アドバイスありがとうございます。

    DataGridViewの派生クラスを作るということは以下のようにDataGridViewのカスタムコントロールを

    作成するということで良いのでしょうか?

     

    namespace DataGridView_Cst
    {
        public partial class DataGridView_Cst : DataGridView
        {
            public DataGridView_Cst()
            {
                InitializeComponent();
            }
            // ホイールマウス制御
            protected override void OnMouseWheel(MouseEventArgs e)
            {
                MouseEventArgs ex = new MouseEventArgs(e.Button,e.Clicks,e.X,e.Y,e.Delta/3);
                base.OnMouseWheel(ex);
            }
        }
    }

     

    この方法だと、自分の考えていたようにスクロール時の描画もスムーズに動くようになりました。

    2007年9月3日 0:33
  •  札幌臨床 さんからの引用

    DataGridViewの派生クラスを作るということは以下のようにDataGridViewのカスタムコントロールを

    作成するということで良いのでしょうか?

     

    はい、その通りです。

    正しく動いたようで何よりです。

     

    ただ1点気になる事があります。

    単純にOnMouseWheelの値を1/3にしていますが、

    マウスの設定でホイールの量を変更した場合にどのような動作になるかを1度検証しておいた方がいいと思います。

     

     

    2007年9月3日 10:59
  • C.Johnさん

    返信ありがとうございます。このあと以下のように変更してみました。

     

                // マウス ホイールを回転したときにスクロールする行数を取得
                Int32 scroll = SystemInformation.MouseWheelScrollLines;

     

                // MouseEventArgsクラスの移動量を1行に変更
                MouseEventArgs ex = new MouseEventArgs( e.Button, e.Clicks, e.X, e.Y, e.Delta/scroll );

    とりあえず思ったとおりに動作しています。

    1週間悩んでいたものが無事に解決できました。ありがとうございました。

    2007年9月3日 12:09