2.2つの ListView のスクロールの同期を取る(20_Lvw_02) (旧、SampleNo.298) |
1.2つの ListView のスクロールの同期を取る 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つの ListView のスクロールの同期を取る |
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 If Button1.Text = "同期中" Then Button1.Text = "非同期中" Else Button1.Text = "同期中" End If End Sub Private oldTopIndex As Integer Private Sub Timer1_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles Timer1.Elapsed 'どちらがスクロールされたかを判断しスクロールした方に合せる If ListView1.TopItem.Index = ListView2.TopItem.Index Then Exit Sub If oldTopIndex <> ListView1.TopItem.Index Then ListView2.EnsureVisible(ListView2.Items.Count - 2) ListView2.EnsureVisible(ListView1.TopItem.Index) Else ListView1.EnsureVisible(ListView1.Items.Count - 2) ListView1.EnsureVisible(ListView2.TopItem.Index) End If '現在の位置を保存 oldTopIndex = ListView1.TopItem.Index End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Timer1.Enabled = False ListView1.Columns.Add("名前", 220, HorizontalAlignment.Left) ListView2.Columns.Add("名前", 220, HorizontalAlignment.Left) ListView1.View = View.Details ListView2.View = View.Details ListView1.BeginUpdate() ListView2.BeginUpdate() For i As Integer = 0 To 100000 '100,000 行でテストしても同様に動作します 'アイテムを追加 ListView1.Items.Add("MyListViewItemNo." & i) ListView2.Items.Add("MyListViewItemNo." & i) Next i ListView1.EndUpdate() ListView2.EndUpdate() Button1.Text = "非同期中" End Sub Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing My.Settings.FormLocation = Me.Location My.Settings.FormSize = Me.Size Dim DelFileName As String = "" If System.IO.File.Exists(DelFileName) Then Dim result As DialogResult = MessageBox.Show("ファイル[" & DelFileName & "]を削除しますか。", _ "ファイルの削除確認", MessageBoxButtons.YesNo) If result = Windows.Forms.DialogResult.Yes Then 'ファイルを削除 Dim fi As New System.IO.FileInfo(DelFileName) fi.Delete() End If End If Timer1.Enabled = False End Sub End Class 図1.上記実行結果 こちらは、ListBox と違い100,000 件でも問題なくスムーズに同期がとれます。 但し、Windows 8.1 では、ホイールマウスの動作がWindows 7 等とでは変更されているようで?、MouseWheel イベントを操作する方法(2つのListViewのスクロールの同期を取る)ではうまく追随してくれません。 従って、Timer コントロールを使って同期を取っております。(この事は、ListBox でも同様の動作を確認しております。) |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
リストビュー |