DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リストボックスのスクロールについて

分類:[全般]

はじめまして、VB.NETを始めてまだ2ヶ月の未熟者です。
初めて質問させていただきます。

リストボックス(ListBox)コントロールを使用した際、表示データが多いと、垂直スクロールが表示されますが、そのスクロールを動かしたときに発生するイベントというのはあるのでしょうか?
また、ListBox上のデータを選択した(=1明細が反転している)状態で、垂直スクロールを動かすと、その明細は反転した状態で移動していきますが、その反転している位置を知ることなどできるのでしょうか?

実は、未熟者ながら、ListBox上の選択された1明細をTextBox化して、そこで入力されたデータをまたListBoxに返すという、エディタのようなオリジナルコントロールを作ろうとしています。
その中では、TextBoxのKeyDownイベントで、ListBox.SelectedIndexを変更し、それと同時にTextBoxの位置をListBox.SelectedIndexの位置に移動させて、常にListBoxの選択位置が入力位置になるようにしてます。
しかし、垂直スクロールでListBoxを動かすと、ListBoxとTextBoxが別れ別れになってしまったのです。

長々と書いてしまい、申し訳ありません。
どうかお知恵をお貸しください。よろしくお願いします。
■No393に返信(むにゅさんの記事)
> リストボックス(ListBox)コントロールを使用した際、表示データが多いと、垂直スクロールが表示されますが、そのスクロールを動かしたときに発生するイベントというのはあるのでしょうか?

ListBoxクラスからの継承クラスを作成し、WndProcをオーバーライドし、WM_VSCROLL(0x115)メッセージを待つということになるのではないでしょうか。

> また、ListBox上のデータを選択した(=1明細が反転している)状態で、垂直スクロールを動かすと、その明細は反転した状態で移動していきますが、その反転している位置を知ることなどできるのでしょうか?

項目の範囲はListBoxのGetItemRectangleメソッドで取得できそうです。
せっかくすぐにレスして下さったのに、私の返事が遅くなり、申し訳ありませんでした。m(__)m
■No395に返信(管理人さんの記事)
> > ListBoxクラスからの継承クラスを作成し、WndProcをオーバーライドし、
実は初心者なもので、この「継承クラス」自体を理解していませんでした。
この数週間調べて、何とか継承クラスまで作ったのですが・・・
以下はそのロジックです。
---------------------------------------------------------
Public Class clsSedit
Inherits System.Windows.Forms.ListBox

Public Overloads Sub WndProc()
End Sub

Public Overridable Overloads Sub WndProc(ByRef m As Message)
If m.Msg = WM_VSCROLL Then
MsgBox("メッセージ=" & m.Msg)
End If
End Sub
End Class
------------------------------------------------------------------------
果たして、おしゃっていたことがこれで正しいのかもよくわかっていません。
また、ここまでできたのですが、これからどう「WndProc」を使っていいのか分かりません。
本当に申し訳ないのですが、その辺を教えていただけないでしょうか?
よろしくお願いします。
■No526に返信(むにゅさんの記事)
> 果たして、おしゃっていたことがこれで正しいのかもよくわかっていません。
> また、ここまでできたのですが、これからどう「WndProc」を使っていいのか分かりません。

惜しいですが、
MyBase.WndProc(m)
を入れてください。

Public Class clsSedit
Inherits System.Windows.Forms.ListBox

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = &H115 Then
MsgBox("スクロールしたよ")
End If
MyBase.WndProc(m)
End Sub
End Class

MsgBox("スクロールしたよ")
の部分をスクロールした時の処理に置き換えます。イベントとして発生させる時は、それなりの処理が必要です。
またまたお返事が遅くなり、申し訳ありませんでした。
結局、悩んだ末、ListBoxの上にVScrollBarを貼り付け、VScrollBar_Scrollイベント
で判断するようにしました。
せっかくご指導していただいたのに、自己レスで申し訳ありません。
お世話になりました。m(__)m
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板