PDA

Vollständige Version anzeigen : Sortierung im Listview und abwechselnde Hintergrundfarbe


kaosqlco
10.07.2008, 14:39
Hallo Forum,

ich habe folgendes VB-Problem:
Ich möchte die Einträge in einem Listview-Steuerelement aufsteigend sortieren und außerdem die Zeilenhintergründe abwechselnd weiß und grau einfärben.
Dafür benutze ich folgenden Code


Me.lvw_gruppen.Sorting = SortOrder.Ascending

For z = 0 To Me.lvw_gruppen.Items.Count - 1
If z Mod 2 = 0 Then
Me.lvw_gruppen.Items(z).BackColor = Color.Gainsboro
Else
Me.lvw_gruppen.Items(z).BackColor = Color.WhiteSmoke
End If
Next


Das abwechselne Einfärben funktioniert tadellos, doch sobald ich die Sortierung einschalte, kommt alles durcheinander.
Es ändert auch nichts, wenn ich die Liste erst nach dem Einfärben der Zeilen sortieren lasse.
Die Liste schon sortiert zu füllen, ist leider nicht möglich.
Wer hat einen Tipp für mich?

Gruß Jan

Noodles
10.07.2008, 16:18
Was heißt denn, "kommt alles durcheinander"?
Ich nehme an, die Abwechslung der Zeilenfarbe ist gemeint. Was ist wenn Du nach jedem sortieren die Zeilen neu einfärbst?

kaosqlco
10.07.2008, 17:24
Hallo Noodles, hallo Forum,
ja, nach dem Sortieren wechseln sich die Zeilenfarben nicht mehr ab.
Nach dem Sortieren neu einzufärben, hilft leider nicht (siehe Codebeispiel).
Die Indexe der einzelnen Zeilen stimmen allerdings, die erste Zeile hat Index = 0, die zweite Index = 1 usw. - Deshalb müßte es eigentlich funktionieren!
Wahrscheinlich ist die Sortierung noch nicht abgeschlossen und die Indexe sind noch nicht neu vergeben, wenn die Formatierung schon losgeht. - Anders kann ich mir das nicht erklären.
Solange beides aus der gleichen Prozedur gestartet wird, funktioniert es nicht. Wenn ich nach Abschluss des Befüllens der Liste incl. Sortierung die Formatierung per Button manuell anstoße, funktioniert es wie gewollt.
Dass das die Lösung ist, kann ich fast nicht glauben!
Wer hat noch einen Tipp für mich?

Gruß Jan

kaosqlco
19.07.2008, 09:04
Hallo Forum,

die Lösung, das Formatieren nach der Sortierung manuell anzustoßen klappt übrigens nicht, wenn die ListviewItems gruppiert sind. Hier hat jedes Item noch seinen ursprünglichen Index, mit dem es in die Liste geschrieben wurde.
Jetzt suche ich nach einer Lösung, die Listeneinträge unabhängig vom Index von oben nach unten zu durchlaufen.
Wer hat einen Tipp?

Gruß Jan

wincnc
19.07.2008, 09:15
Hallo

Dafür kannst Du For Each... benutzen.
For Each item As ListViewItem In Me.ListView1.Items
' Dein Code
Next

kaosqlco
19.07.2008, 10:28
Hallo wincnc,

an For Each hatte ich auch schon gedacht. Leider funktioniert es damit auch nicht, zumindest so wie ich es getestet habe.


Dim zeile As Integer = 1
With lvw
For Each itm As ListViewItem In lvw.Items
MsgBox(itm.Index)
If zeile Mod 2 = 0 Then
itm.BackColor = Color.LightYellow
Else
itm.BackColor = Color.WhiteSmoke
End If
zeile = zeile + 1
Next

End With


Ich dachte, das es so gehen müßte. Leider werden die Listviewitems in der Reihenfolge ihres Index angefaßt und so auch abwechselnd eingefärbt. Da sie aber nach der Sortierung oder Gruppierung nicht nach der Reihenfolge ihres Index gelistet sind, sind die Zeilen auch nicht abwechselnd eingefärbt.
Trotzdem danke für Mitdenken.

Gruß Jan

kaosqlco
19.07.2008, 12:52
Hallo,

das Thema hat mir keine Ruhe gelassen. Ich habe eine Lösung, ob die endgültige weiß ich noch nicht.


Private Sub SetLvwItemBackcolor(ByVal lvw As ListView, ByVal bShowGroups As Boolean)
Dim zeile As Integer = 1

With lvw

Select Case bShowGroups
Case True

For Each grp As ListViewGroup In .Groups

For Each itm As ListViewItem In .Items
If itm.Group.ToString = grp.Header.ToString Then
If zeile = 1 Then
itm.BackColor = Color.LightYellow
zeile = 2
Else
itm.BackColor = Color.WhiteSmoke
zeile = 1
End If
End If

Next
Next

Case False

For Each itm As ListViewItem In lvw.Items
If zeile = 1 Then
itm.BackColor = Color.LightYellow
zeile = 2
Else
itm.BackColor = Color.WhiteSmoke
zeile = 1
End If
Next

End Select
End With
End Sub


Damit funktioniert die Formatierung für die Fälle:
ShowGroups=true, Gruppen vorhanden
ShowGroups=false, keine Gruppen
ShowGroups=false, Gruppen vorhanden
Die Sortierung spielt plötzlich keine Rolle mehr.

Für ShowGroups=true und keine Gruppen muss ich mir noch was ausdenken.

Gruß Jan