Beantwortet Bei MouseMove individuelle Farbe für ListviewItem

  • Montag, 18. Juni 2012 06:38
     
      Enthält Code

    Hallo Leute,

    ich möchte in meinem Programm beim MouseMove für das aktuelle ListviewItem eine andere Farbe setzen und sobald ich ein neues ListviewItem auswähle, die alte Farbe für das alte ListviewItem zurücksetzen. Ich bekomme es aber einfach nicht hin. Es wird die Farbe nicht zurückgesetzt.

    Kann mir einer vielleicht einen Tipp geben, woran es liegt?

    Dim ThisItemOld as ListviewItem
    
        Private Sub lvwMandanten_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lvwMandanten.MouseMove
            Dim thisItem As ListViewItem = lvwMandanten.GetItemAt(e.X, e.Y)
           
            If ThisItemOld IsNot Nothing Then
                'Vorzeitiger Aussprung, da gleiches Item
                If thisItem.Index = ThisItemOld.Index Then Exit Sub
            End If
    
    
            If thisItem IsNot Nothing Then
                If ThisItemOld IsNot Nothing Then
                    'zurücksetzen auf alte Farbe
                     lvwMandanten.Items(ThisItemOld.Index).BackColor = ThisItemOld.BackColor
                Else
    
                End If
                   
                ThisItemOld = thisItem
    
                'neues Item mit neuer Farbe
                thisItem.BackColor = Color.LightSalmon
    
            Else
    
            End If
        End Sub

    Das Listview wird vorweg mit alternierenden Farben dargestellt (Tabellierfunktion).

    Vielen Dank im voraus.

    Gruß Ahmed


Alle Antworten

  • Montag, 18. Juni 2012 08:06
     
      Enthält Code

    Hallo Leute,

    ich habe meinen Fehler gefunden. Die BackColor-Eigenschaft wurde vom ThisItemOld ja geändert und diese geänderte Backcolor-Eigenschaft wird zurückgeschrieben, was zu dem Fehler führt.

    Ich muss daher einfach zusätzlich die Backcolor-Farbe zwischenspeichern.

    Dim ThisItemOld As ListViewItem, LastColor As Color

    Private Sub lvwMandanten_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lvwMandanten.MouseMove Dim thisItem As ListViewItem = lvwMandanten.GetItemAt(e.X, e.Y) On Error Resume Next If ThisItemOld IsNot Nothing Then If thisItem.Index = ThisItemOld.Index Then Exit Sub End If If thisItem IsNot Nothing Then If ThisItemOld IsNot Nothing Then lvwMandanten.Items(ThisItemOld.Index).BackColor = LastColor Else End If ThisItemOld = thisItem LastColor = thisItem.BackColor thisItem.BackColor = Color.LightSalmon Else End If End Sub

    Aber nun habe ich den Schönheitsfehler, dass die Anzeige immer flackert. Kann man das irgendwie unterbinden?

    Ich prüfe doch schon ob die Indices gleich sind und springe aus der Funktion vorher aus.

    Vielen Dank im voraus.

    Gruß Ahmed

    • Als Antwort markiert Ahmed Martens Montag, 18. Juni 2012 10:35
    •  
  • Montag, 18. Juni 2012 10:36
     
     Beantwortet Enthält Code

    Hallo Leute,

    ich habe die Lösung gefunden und die nennt sich "DoubleBuffered". Die Eigenschaft kann leider nicht direkt gesetzt werden, sondern über einen Umweg. Dazu werden die Standardfunktionen in eine individuelles Listview vererbt und in den neuen ListviewEx kann die Eigenschaft gesetzt werden.

    1. Schritt Neues ListviewEx über eine neue Klasse erstellen:

    Einfach eine neu Klasse hinzufügen z. B. mit den Namen 'ListviewEx.vb'.

    In der neuen Klasse folgenden Code einfügen:

    Partial Public Class ListViewEx
        Inherits ListView
    
        Public Sub New()
            MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            Me.DoubleBuffered = True
            MyBase.HeaderStyle = ColumnHeaderStyle.Nonclickable
            MyBase.FullRowSelect = True
        End Sub
    End Class

    2. Dieses neue ListviewEx einfach in die Toolbox ziehen, damit es wie ein gewohntes Control angesprochen werden kann. Danach einfach auf das Formular ziehen. Alle Methoden des alten Listview einfach löschen. Dazu vorher den Code kopieren, die alte Methode löschen und neu auswählen. Den kopierten Code wieder einfügen. Und schon ist alles umgestellt.

    Bei mir hat es so funktioniert.

    Gruß Ahmed