9.2つのリストボックスのスクロールの同期を取る(19_Lst_11) (旧、SampleNo.109) |
1.2つのリストボックスのスクロールの同期を取る 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :追加なし 参照設定:追加なし その他 : : このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.2つのリストボックスのスクロールの同期を取る |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'タイマーコントロールでイベントを発生/解除 'できれば、System.Timers.Timer の方を使って下さい。 Timer1.Interval = 50 Timer1.Enabled = Not Timer1.Enabled End Sub Private oldTopIndex As Integer 'リストボックスのトップアイテムのインデックス値 'できれば、System.Timers.Timer の方を使って下さい。 Private Sub Timer1_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles Timer1.Elapsed 'どちらがスクロールされたかを判断しスクロールした方に合せる If oldTopIndex <> ListBox1.TopIndex Then 'ListBox1.TopIndex に合せる ListBox2.TopIndex = ListBox1.TopIndex Else ListBox1.TopIndex = ListBox2.TopIndex End If '現在の位置を保存 oldTopIndex = ListBox1.TopIndex End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'ダミーのデータを作成及び表示 Dim i As Integer ListBox1.BeginUpdate() ListBox2.BeginUpdate() '65000 件を超えるようなデータを表示する場合、XP Visuale を有効にするのチェックボックスを外しておいて下さい。 For i = 0 To 65000 '65548 これ以上の場合 ListBox のスクロールバーが正常に動作しません。 ListBox1.Items.Add(CStr(i).PadLeft(8) & " 番目の項目のデータ") ListBox2.Items.Add(CStr(i).PadLeft(8) & " 番目の項目のデータ") Next i ListBox1.EndUpdate() ListBox2.EndUpdate() End Sub End Class 注意 ListBox で 65500 件を超えるようなデータを表示する場合、[XP Visual スタイルを有効にする(X)]のチェックボックスを外しておいて下さい。 ListBox で 65500 件を超えるようなデータを表示すると垂直スクロールバーをドラッグで移動させた場合正常に動作しなくなります。 (バグなのか、仕様なのかは、さだかではありませんが、件数が多い場合 ListView 等の使用を検討してください) 今回は、簡便的にタイマーイベントで処理しておりますが、スクロールイベント組み込んだカスタムコントロールを作成して実現する方法は、下記のサイトへ[魔界の仮面弁士]さんが投稿されておられます。 http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200407/04070102.txt |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
リストボックス スクロール 同期 垂直スクロールバー 異常 スクロールバー 動作不良 2つのListBox |