tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルlistviewのスクロールについて
記事No8261
投稿日: 2008/10/02(Thu) 15:39
投稿者なぎ
いつもお世話になっております。
listviewのスクロールについてですが
ListView2、ListView3があり、
どちらかのリストをスクロールした場合、もう一方のリストも
同時にスクロールさせる方法はありますでしょうか?
(2つのリストの先頭行を合わせたい)
現状は以下のソースで検証中ですが、1行ずれてしまいます。
(検証のためリスト内には1−50までのデータを設定しています)
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer
        i = 0
        With ListView2
            .View = View.Details
            Do Until i = 50
                ListView2.Items.Add(i)
                i = i + 1
            Loop
        End With
        i = 0
        With ListView3
            .View = View.Details
            Do Until i = 50
                ListView3.Items.Add(i)
                i = i + 1
            Loop
        End With
    End Sub
    Private Sub ListView2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView2.SelectedIndexChanged
            ListView3.EnsureVisible(ListView3.Items.Count - 1)
            ListView3.EnsureVisible(ListView2.TopItem.Index)
    End Sub

[ツリー表示へ]
タイトルRe: listviewのスクロールについて
記事No8264
投稿日: 2008/10/02(Thu) 17:38
投稿者るしぇ
>1行ずれてしまいます
こちらの環境では、ずれませんでした。(WinXp、VB2005 Express Edition)
イベントでプロパティに設定されている値を全て出力して
どういった処理が何回実行されているか確認してみては?

あと、ListView の高さが違う場合は、一番下までスクロールしちゃうと
それ以上スクロールできない場合にずれてみえるけど、そういう話では
ないんだよね?

[ツリー表示へ]
タイトルRe^2: listviewのスクロールについて
記事No8266
投稿日: 2008/10/02(Thu) 18:12
投稿者なぎ
>るしぇさん
ありがとうございます。
こちらの環境はWinXp、VB2005です。

その後自分でもいろいろ試しておりますが、
クリックでの選択行を移動をさせた場合は期待通りの動きをしますが、
キーボードで下へ移動させた場合にずれてしまいます。

[ツリー表示へ]
タイトルRe^3: listviewのスクロールについて
記事No8267
投稿日: 2008/10/02(Thu) 19:04
投稿者るしぇ
>クリックでの選択行を移動をさせた場合は期待通りの動きをしますが、
>キーボードで下へ移動させた場合にずれてしまいます。
なるほど。マウスでクリックした時点では、既に画面上で一番上の
アイテムが表示されてるけど、キーボードの場合、
1)↓キー押下
2)アイテムセレクト
3)セレクトされたアイテムがリストの欄外
4)スクロールして表示
で処理されていることが予想できるね。

2)の時点ではスクロールしてないから移動できないのでしょう。
…とすると、タイマーとかでスクロールの後でイベントを起こすか
スクロールのイベントを取るか。。。

ちなみに[VB6.0]でリッチテキストボックスだけど、ウィンドウ
メッセージを処理してますね。
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=74

[ツリー表示へ]
タイトルRe^4: listviewのスクロールについて
記事No8299
投稿日: 2008/10/07(Tue) 15:39
投稿者なぎ
>るしぇさん
タイマーとかでスクロールの後でイベントの起こし方はどうするのでしょうか?
ListView2_SelectedIndexChanged関数へタイマーで時間を置くと言う意味ですか?

[ツリー表示へ]
タイトルRe^5: listviewのスクロールについて
記事No8301
投稿日: 2008/10/08(Wed) 11:09
投稿者花ちゃん
> タイマーとかでスクロールの後でイベントの起こし方はどうするのでしょうか?

ListView にはどの程度のデータを表示されているのでしょうか?
あまりにも多いようですとうまく追随しないようです。
(ListBox で同様のサンプルを作成 No.109  No.131)

タイマーコントロールを使うなら、タイマーコントロール で 双方のTopItem.Index の
値の変化を監視して変化があった方にもう一方の方のTopItem.Index の値を設定すれば
いいのではないでしょうか?

※ 未確認なのでうまく動作するか、午後からでも試してみます。

又は、下記で魔界の仮面弁士さんが投稿されているコードを応用するとか。
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200407/200407_04070102.html

[ツリー表示へ]
タイトルRe^5: listviewのスクロールについて
記事No8302
投稿日: 2008/10/08(Wed) 14:18
投稿者花ちゃん
1列20桁程度のデータで10万行でテストして見ましたが問題なく瞬時に追随しました。
取敢えずマウスのスクロール(クリック・ドラッグ)関係のテストと
↓ ↑ キーによるスクロールでのテストのみで、その他の動作でのテストは十分に
行ってはいません。

Public Class myListView
   Public Event TopIndexChanged()  
   Protected Overrides Sub WndProc(ByRef m As Message)
      Const WM_VSCROLL As Integer = &H115
      Select Case m.Msg                    
         Case WM_VSCROLL                    
            RaiseEvent TopIndexChanged()    
      End Select
      MyBase.WndProc(m)                  
   End Sub
   Protected Overrides Sub OnMouseWheel(ByVal e As MouseEventArgs)
      If e.Delta <> 0 Then            
         RaiseEvent TopIndexChanged()    
      End If
   End Sub
   Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)
      RaiseEvent TopIndexChanged()
   End Sub
   Protected Overrides Sub OnKeyUP(ByVal e As KeyEventArgs)
      RaiseEvent TopIndexChanged()
   End Sub
End Class


スクロールの同期をとる場合
Private Sub MyListView1_TopIndexChanged() Handles MyListView1.TopIndexChanged
   MyListView2.EnsureVisible(MyListView2.Items.Count - 1)
   MyListView2.EnsureVisible(MyListView1.TopItem.Index)
End Sub

Private Sub MyListView2_TopIndexChanged() Handles MyListView2.TopIndexChanged
   MyListView1.EnsureVisible(MyListView1.Items.Count - 1)
   MyListView1.EnsureVisible(MyListView2.TopItem.Index)
End Sub

[ツリー表示へ]
タイトルRe^6: listviewのスクロールについて
記事No8303
投稿日: 2008/10/08(Wed) 17:57
投稿者なぎ
>>花ちゃんさん るしぇさん
アドバイス・サンプルありがとうございました。
おかげさまで動作確認が行なえました。
また、何かありましたらアドバイスお願いします。

[ツリー表示へ]