- PR -

スクロールバーを掴んだ時のイベントについて

投稿者投稿内容
たお
ベテラン
会議室デビュー日: 2006/10/27
投稿数: 90
投稿日時: 2008-05-02 00:20
C#でListViewもしくはDataGrideViewで
Timerを使用してデータを追加し自動スクロール
するプログラムを作成しています。

ユーザがスクロールバーを掴んだ時には、
Timerを止めてスクロールできるようし、
逆にスクロールバーを離した時にはTimerを再開する
ようにしたいと思っています。

マウスでスクロールバーを掴んだ時と離した時のイベントを
探したのですが見つかりませんでした。
スクロールバーを掴んだ時と離した時のイベントを取得
する方法を教えてください。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-05-02 08:55
未確認だけど、MouseDownとMouseUpってのはどう?
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-05-02 10:21
スクロールバー側で掴んだときと離したときのイベントを
拾うのではなく、タイマー側でスクロールバーの Capture
プロパティをチェックして、Capture プロパティが true の
ときはマウスが押されていると判断してみるのはどうでしょ
うか。

スクロールバーにフォーカスを当ててキーでスクロール
させた場合はどうなのとか、スクロールバーをクリックして
スクロールさせたときはどーすんの?とかありますが、とり
あえずはこれでいけると思います。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
たお
ベテラン
会議室デビュー日: 2006/10/27
投稿数: 90
投稿日時: 2008-05-02 14:11
かずくん、ぽぴ王子 返答ありがとうございます。

>かずくん
>未確認だけど、MouseDownとMouseUpってのはどう?
ListViewとDataGrideViewで
MouseDownとMouseUPではスクロールバーをクリックしても
イベントは発生しませんでした。
おそらく、スクロールバーはListViewやDataGrideViewの
コントロール外に見えます。Formでもダメでした。

>ぽぴ王子
>スクロールバーの Captureプロパティをチェック
こちらを試してみたいのですが、
どの様にすればDataGrideViewやListViewの
スクロールバーを取得できるのかわかりませんでした。

スクロールバーを無効にして、
VScrollBarを作成して、Controll.Addするような
方法でしょうか?
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-02 14:37
引用:

たおさんの書き込み (2008-05-02 14:11) より:

どの様にすればDataGrideViewやListViewの
スクロールバーを取得できるのかわかりませんでした。



ListViewは分かりませんが、DataGridViewであれば、Controlsプロパティの中にScrollBarオブジェクトが含まれていると思います。
クイックウォッチで覗くとすぐ分かるかも。

# ただ、ぽぴ王子さんの持つ懸念は私も持っています。
# 付け加えるとマウスホイールによるスクロールとか。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-05-02 14:40
引用:

たおさんの書き込み (2008-05-02 14:11) より:

>ぽぴ王子
>スクロールバーの Captureプロパティをチェック
こちらを試してみたいのですが、
どの様にすればDataGrideViewやListViewの
スクロールバーを取得できるのかわかりませんでした。


うわーごめんなさい。
DataGridView だということをすっかり忘れていて
普通のスクロールバーをフォームに配置してチェック
してました。

ちょっと調べてみましたが、DataGridView.Controls
に HScrollBar と VScrollBar が存在するようで
その中から VScrollBar を取得して Capture を見れば
無理矢理ですがなんとかできそうな感じです。

テスト用にこんな感じのコードを書いてみました。

コード:

    private void timer1_Tick(object sender, EventArgs e)
    {
        // ここは起動時に一度だけやればいいと思う
        VScrollBar bar = null;
        foreach (Control ct in dataGridView1.Controls)
        {
            if (ct is VScrollBar)
            {
                bar = ct as VScrollBar;
                break;
            }
        }

        if (bar != null && bar.Capture == true)
        {
            Console.WriteLine("キャプチャされとんで!");
        }
        else
        {
            Console.WriteLine("キャプチャされてへんで!");
        }
    }


# しまった、rain さんに先を越された(早食い競争じゃありません)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-05-02 14:44
DataGridView に関しては VerticalScrollBar プロパティがありますので、
これを使う手もありそうです。
Protected なので継承する必要があると思いますが。

ListView に関しては調べてみた感じでは何もなさそうです。
たお
ベテラン
会議室デビュー日: 2006/10/27
投稿数: 90
投稿日時: 2008-05-07 01:40
返信ありがとうございます。

ぽぴ王子さんのやり方で問題無くできました。
ありがとうございます。

皆さんのご指摘の通り、キー操作やホイール操作での
問題がありますが、勉強用途で作成しているので
今回は見送ります・・。

テッテさんの通り、ListViewについては
該当するプロパティなどが無く、
スクロールを取得することができませんでした。

ListViewでのスクロールを取得する方法はありますでしょうか?

スキルアップ/キャリアアップ(JOB@IT)