Announcement

Collapse
No announcement yet.

ListView Fehler Windows-Vista abhängig?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ListView Fehler Windows-Vista abhängig?

    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.
    • 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)
    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:

    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
    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!









    [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]
    Zuletzt editiert von basti01985; 31.10.2008, 10:19.

  • #2
    Hallo basti,

    wozu hängst Du den IndexHandler ab und wieder an?

    Du fragst zwei Mal den lv3.SelectedItems.Count ab mit der gleichen Folgeaktion, das ist nicht tragisch aber überflüssig.

    Dann hätte ich noch folgende Anmerkung.
    Dein Code soll sicherstellen das die lv2 und lv3 immer die gleichen Elemente markiert haben wie lv1, dadurch ergibt sich: wenn lv1 etwas ausgewählt hat, lv2 und lv3 ebenfalls etwas aufgewählt haben, zumindest wenn der User das nicht explizit in den anderen Boxen geändert hat. Da Du die geänderte Selektion aber in jedem Fall überschreibst ist das unerheblich.
    Deswegen brauchst Du lv2 und lv3 nicht abfragen ob da was selektiert ist, gehe einfach davon aus und mach einen lv2.SelectedItems.Clear dann ist nix mehr selektiert.

    Dein Code geht davon aus das immer nur ein Element markiert ist. Mit folgenden Codestück wäre es möglich das ganze auch bei Multiselektlisten benutzen zu können.

    [highlight=vbnet]
    ' Neue Version
    If lv1.SelectedItems.Count > 0 Then
    lv2.SelectedItems.Clear()
    lv3.SelectedItems.Clear()
    For Each Itm In lv1.SelectedItems
    lv2.Items(Itm.Index).Selected = True
    lv3.Items(Itm.Index).Selected = True
    Next
    lv3.TopItem = lv3.Items(lv1.TopItem.Index)
    lv2.TopItem = lv2.Items(lv1.TopItem.Index)
    End If[/highlight]

    Dein eigentliches Problem kann ich erst daheim testen da ich in der Firma nur XP zur Verfügung habe.

    Gruß Womble

    Comment


    • #3
      Originally posted by Womble View Post

      wozu hängst Du den IndexHandler ab und wieder an?
      Der eigentliche Code den ich verwende ist noch um die Indexchanged ereignisse der anderen beiden Listen erweitert, heißt also dort passiert eine vergleichbare Abfolge von Ereignissen.

      Hänge ich den Indexhandler nicht ab bzw wieder an, führt dies dazu das die zeile

      Code:
      lv2.Items(lv1.SelectedIndices(0)).Selected = True
      unter dem lv1.selectedItemchanged event das selbige Event der liste 2 auslöst.

      Die daraus resultierende Schleife vermeide ich durch das deaktivieren und spätere aktivieren des Handlers.

      Comment

      Working...
      X