ListView manuell sortieren


mirmi

Grünschnabel
Hallo :)

Habe mir den unten angeführten Comparer in mein Prog eingefügt. (Hab ich in einem Forum gefunden...)
Ich kann meine liste mit dem Comparer nur 1x sortieren.

Leider es nicht, wenn ich die Liste aus meinen Arrays neu schreibe.
Sobald die erste Zeile erstellt wurde, also item(0), springt der Comparer an und bekommt natürlich eine Fehlermeldung, weil die Vergleichsliste iy keine Einträge enthält. Klar, sie ist ja auch noch nicht wiederbefüllt.

Ich würde den comparer gerne manuell anstarten.
momentan wird er so aktiviert:
varfrmMachines.lstViewMachines.ListViewItemSorter = New ColumnComparer(1, varfrmMachines.lstViewMachines.Sorting)

Leider ist er ab diesem Zeitpunkt immer aktiv. Gibt es eine Möglichkeit, die Sortierung manuell zu starten?
Ich muss in meinem Prog den ListView mehrmals löschen und neu befüllen. Erst nach dem Befüllen, soll nach der 2. Spalte sortiert werden.

Bitte um einen Tip
grüße
mirmi

Comparer-Code:
Public Class ColumnComparer
Implements IComparer
Private _ColumnIndex As System.Int32
Private _Sorting As System.Windows.Forms.SortOrder

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements

System.Collections.IComparer.Compare
Dim ix As System.Windows.Forms.ListViewItem
Dim iy As System.Windows.Forms.ListViewItem

ix = DirectCast(x, System.Windows.Forms.ListViewItem)
iy = DirectCast(y, System.Windows.Forms.ListViewItem)

If ix.SubItems.Count > _ColumnIndex And iy.SubItems.Count = 0 Then
Return 1
ElseIf ix.SubItems.Count > _ColumnIndex And iy.SubItems.Count = 0 Then
Return -1
Else
Return System.String.Compare(ix.SubItems(_ColumnIndex).Text, iy.SubItems(_ColumnIndex).Text)
End If
End Function

Public Sub New(ByVal ColumnIndex As System.Int32, ByVal Sorting As System.Windows.Forms.SortOrder)
_ColumnIndex = ColumnIndex
_Sorting = Sorting
End Sub
End Class :confused:
 

mirmi

Grünschnabel
hier ist die Antwort :p

aktivieren durch: ListView1.ListViewItemSorter = New ColumnComparer(1, ListView1.Sorting)
deaktivieren durch: ListView1.ListViewItemSorter = New ColumnComparer(Nothing, Nothing)

grüße
mirmi
 

mirmi

Grünschnabel
Re: leider doch nicht gelöst...

Leider hats doch nicht hingehauen.
Ich würds so gern mit einer einfachen Prozedur lösen....
Hier nochmal ein Erklärungsveruch...

Habe in meinem Programm einige ListViews in verschiedenen Frames. Diese werden immer wieder geleert, neu befüllt,

Einträge werden hinzugefügt oder gelöscht.
Nach dem "fertigstellen" möchte ich die Liste vor dem nächsten Update sortieren.
Und zwar nach der 2. Spalte.

Habs bereits mit dem einfügen einer Comparer-Klasse aus dem "2- spaltige listbox"-Thread (vb-Magazin.de) versucht. Funktioniert nicht, weil der Comparer immer anspringt, auch wenn die Liste soeben geleert wurde und neu befüllt wird. Gleich beim 2. Eintrag crasht es.

Gibt es eine Alternative für die in Vb6 verfügbare ListView Eigenschaft .SortKey, für die Spalte nach der sortiert werden soll?

Bitte um Hilfe!
und Bedanke mich vorab!
grüße
mirmi
 

mirmi

Grünschnabel
Lösung ;)

Also, ich hab das jetzt so gemacht: (sicher nicht die schönste Lösung, aber es ;))

Listeneinträge in 1dimensionales Array eintragen. Mit ; als Trennzeichen. Dieses 1dimensionale Array sortieren und anschliessend wieder splitten und in die Liste eintragen.

Sortierungs-Prozedur:
Sub ShellSort(ByRef sort() As String, ByVal numOfElements As Short)
'sortiert die Elemente der Arrays sort() in absteigender Riehenfolge und übergibt das Ergebnis der aufrufenden Prozedur
Dim temp As String
Dim i, j, span As Short

span = numOfElements \ 2
Do While span > 0
For i = span To numOfElements - 1
j = i - span
For j = (i - span) To 0 Step -span
If sort(j) <= sort(j + span) Then Exit For
'Arrayelemente, die nicht in der richtigen Reihenfolge stehen, vertauschen
temp = sort(j)
sort(j) = sort(j + span)
sort(j + span) = temp
Next j
Next i
span = span \ 2
Loop
End Sub

danke und liegrü
mirmi
 

Neue Beiträge