Bei MouseMove individuelle Farbe für ListviewItem
-
Montag, 18. Juni 2012 06:38
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 SubDas Listview wird vorweg mit alternierenden Farben dargestellt (Tabellierfunktion).
Vielen Dank im voraus.
Gruß Ahmed
- Bearbeitet Ahmed Martens Montag, 18. Juni 2012 06:39
- Typ geändert Ahmed Martens Montag, 18. Juni 2012 10:35
Alle Antworten
-
Montag, 18. Juni 2012 08:06
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
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 Class2. 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- Als Antwort markiert Ahmed Martens Montag, 18. Juni 2012 10:36
- Bearbeitet Ahmed Martens Montag, 18. Juni 2012 10:36

