Es liegen 3 verschiedene Listviews in der Detailansicht mit je 500 Items zugrunde.
Wird ein Item selektiert sollen in den anderen beiden Listen die Items mitmarkiert werden, die an selbigem Index in ihrer Liste stehen.
Über die Zeilen
wird das jeweilige Top-Item in der 2. und 3. Liste auf das zugehörige Item der ersten Liste gesetzt.
Dies passiert bei jedem Klick in der Liste1.
Wie man nun sehr schön auf den beiden folgenden Bildern sieht ist das Ergebnis sehr unterschiedlich, Unter Vista findet er bei der ersten Zuweisung dieses Objektes nicht den richtigen TopItem Eintrag.
Jetzt wird es interessant:
Ruft man die obigen Zuweisung einfach mehrmals auf:
Verschieben sich die Listen 2 und 3 nochmal und nach dem 3. Aufruf sind die Listen wieder synchron.
Probiert es selbst aus!
Der Code ist unten angehängt.
In der Form selbst braucht ihr nur 3 Listviews einfügen und sie mit lv1,lv2,lv3 benennen.
Womit kann es zusammenhängen? Ich bin mit meinem Latein am Ende!
![](http://img355.imageshack.us/img355/3559/listviewxb2.jpg)
![](http://img355.imageshack.us/img355/listviewxb2.jpg/1/w539.png)
![](http://img368.imageshack.us/img368/6463/listview2xy5.jpg)
![](http://img368.imageshack.us/img368/listview2xy5.jpg/1/w548.png)
[highlight=vbnet]
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
FillLists()
End Sub
Private Sub FillLists()
For i = 0 To 500
lv1.Items.Add(New ListViewItem(i))
lv2.Items.Add(New ListViewItem(i))
lv3.Items.Add(New ListViewItem(i))
Next
End Sub
Private Sub disableIndexHandler()
RemoveHandler Me.lv1.SelectedIndexChanged, AddressOf lv1_SelectedIndexChanged
End Sub
Private Sub enableIndexHandler()
AddHandler Me.lv1.SelectedIndexChanged, AddressOf lv1_SelectedIndexChanged
End Sub
Private Sub lv1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lv1.SelectedIndexChanged
If lv1.SelectedItems.Count > 0 Then
disableIndexHandler()
If lv2.SelectedItems.Count > 0 Then lv2.SelectedItems(0).Selected = False
If lv3.SelectedItems.Count > 0 Then lv3.SelectedItems(0).Selected = False
lv2.Items(lv1.SelectedIndices(0)).Selected = True
If lv3.SelectedItems.Count > 0 Then lv3.SelectedItems(0).Selected = False
lv3.Items(lv1.SelectedIndices(0)).Selected = True
lv3.TopItem = lv3.Items(lv1.TopItem.Index)
lv2.TopItem = lv2.Items(lv1.TopItem.Index)
enableIndexHandler()
End If
End Sub
End Class
[/highlight]
Wird ein Item selektiert sollen in den anderen beiden Listen die Items mitmarkiert werden, die an selbigem Index in ihrer Liste stehen.
- Funktioniert einwandfrei unter WindowsXP.
- Funktioniert nicht unter Windows Vista: In den beiden anderen Listen wird ein anderer Index markiert
Über die Zeilen
Code:
lv3.TopItem = lv3.Items(lv1.TopItem.Index) lv2.TopItem = lv2.Items(lv1.TopItem.Index)
Dies passiert bei jedem Klick in der Liste1.
Wie man nun sehr schön auf den beiden folgenden Bildern sieht ist das Ergebnis sehr unterschiedlich, Unter Vista findet er bei der ersten Zuweisung dieses Objektes nicht den richtigen TopItem Eintrag.
Jetzt wird es interessant:
Ruft man die obigen Zuweisung einfach mehrmals auf:
Code:
lv3.TopItem = lv3.Items(lv1.TopItem.Index) lv3.TopItem = lv3.Items(lv1.TopItem.Index) lv3.TopItem = lv3.Items(lv1.TopItem.Index) lv3.TopItem = lv3.Items(lv1.TopItem.Index) lv2.TopItem = lv2.Items(lv1.TopItem.Index) lv2.TopItem = lv2.Items(lv1.TopItem.Index) lv2.TopItem = lv2.Items(lv1.TopItem.Index) 'Der Index (lv1.TopItem.Index) bleibt immer gleich 'Das gesamte Objekt (lv2.Items(lv1.TopItem.Index)) bleibt auch immer gleich
Probiert es selbst aus!
Der Code ist unten angehängt.
In der Form selbst braucht ihr nur 3 Listviews einfügen und sie mit lv1,lv2,lv3 benennen.
Womit kann es zusammenhängen? Ich bin mit meinem Latein am Ende!
![](http://img355.imageshack.us/img355/3559/listviewxb2.jpg)
![](http://img355.imageshack.us/img355/listviewxb2.jpg/1/w539.png)
![](http://img368.imageshack.us/img368/6463/listview2xy5.jpg)
![](http://img368.imageshack.us/img368/listview2xy5.jpg/1/w548.png)
[highlight=vbnet]
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
FillLists()
End Sub
Private Sub FillLists()
For i = 0 To 500
lv1.Items.Add(New ListViewItem(i))
lv2.Items.Add(New ListViewItem(i))
lv3.Items.Add(New ListViewItem(i))
Next
End Sub
Private Sub disableIndexHandler()
RemoveHandler Me.lv1.SelectedIndexChanged, AddressOf lv1_SelectedIndexChanged
End Sub
Private Sub enableIndexHandler()
AddHandler Me.lv1.SelectedIndexChanged, AddressOf lv1_SelectedIndexChanged
End Sub
Private Sub lv1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lv1.SelectedIndexChanged
If lv1.SelectedItems.Count > 0 Then
disableIndexHandler()
If lv2.SelectedItems.Count > 0 Then lv2.SelectedItems(0).Selected = False
If lv3.SelectedItems.Count > 0 Then lv3.SelectedItems(0).Selected = False
lv2.Items(lv1.SelectedIndices(0)).Selected = True
If lv3.SelectedItems.Count > 0 Then lv3.SelectedItems(0).Selected = False
lv3.Items(lv1.SelectedIndices(0)).Selected = True
lv3.TopItem = lv3.Items(lv1.TopItem.Index)
lv2.TopItem = lv2.Items(lv1.TopItem.Index)
enableIndexHandler()
End If
End Sub
End Class
[/highlight]
Comment