VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 ListView コントロール関係のメニュー
1.ListView コントロールの基本的な操作方法色々
2.2つの ListView のスクロールの同期を取る
3.エクスプローラー風にファイルの一覧を取得して ListView に表示
4. 
5. 
6.
7.
8. 
9. 
10. 
11.
12.
 . 
20.その他、当サイト内に掲載の ListView コントロールに関するサンプル 


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.上記実行結果
 vb2013listview02_1
こちらは、ListBox と違い100,000 件でも問題なくスムーズに同期がとれます。
但し、Windows 8.1 では、ホイールマウスの動作がWindows 7 等とでは変更されているようで?、MouseWheel イベントを操作する方法(2つのListViewのスクロールの同期を取る)ではうまく追随してくれません。
従って、Timer コントロールを使って同期を取っております。(この事は、ListBox でも同様の動作を確認しております。)

このページのトップへ移動します。 2.


このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5. 



このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
リストビュー




このページのトップへ移動します。