Sortierung Datum und Zahlen

Hallo,
ich habe in meiner Listbox ein Datumsfeld, welches aus einer SQL Tabelle ausgelesen wird.
Das Datum ist in der SQL-Tabelle im Standardformat YYYY-MM-DD abgelegt.
In meiner Listbox möchte ich das Datum als DD-MM-YY darstellen. Ich habe mir die Werte vor dem AddRow umgewandelt und alles sieht gut aus.
Die Sortierung in der Listbox ist aber auf Textbasis. Es wird also nach Tag, Monat, Jahr sortiert. Ich möchte aber die Sortierung nach YY-MM-DD
Ich habe mir in der Listbox ein Testfeld dargestellt, in das ich gleichzeitig das Datum wieder in der SQL-Schreibweise einsetze.
Wenn ich nun die Sortierung der Datumsspalte aufrufe sortiere ich die Test-Spalte.

var sort_direction As DesktopListBox.SortDirections = ListBox1.ColumnSortDirectionAt(column)

If column = 2 Then  // Datum DD-MM-YY
  if sort_direction = DesktopListBox.SortDirections.Ascending Then
    ListBox1.ColumnSortDirectionAt(16) = DesktopListBox.SortDirections.Descending
  else
    ListBox1.ColumnSortDirectionAt(16) = DesktopListBox.SortDirections.Ascending
  end If
  ListBox1.SortingColumn = 16 // Testspalte YY-MM-DD
  ListBox1.Sort
else
  ListBox1.SortingColumn = column
  ListBox1.Sort
End If

Das funktioniert.
Ist das der richtige Weg, und wie kann ich die Test-Spalte ausblenden? :thinking:
Das gleiche müsste ich dann für Zahlen-Spalten anwenden.

Dafür gibt es das CompareRows-Event. Packe das Datum in den RowTag. Das CompareRows.Event hat folgende Parameter:

Function CompareRows(row1 as Integer, row2 as Integer, column as Integer, ByRef result as Integer) Handles CompareRows as Boolean

Also sollte Dein Code irgendwie so aussehen:

dim Date1 as DateTime = Listbox.RowTagAt(row1)
dim Date2 as DateTime = Listbox.RowTagAt(row2)

if Date1.SecondsFrom1970 > Date2.SecondsFrom1970 then
   result = true
else
  result = false
end if

return True
1 Like

Ah. Danke vorab!

Ich habe das eben mal getestet. Das Event heißt jetzt RowComparsion.
date1 und date2 sind NIL beim Ausführen und ich fliege raus.
Irgendwas klemmt noch mit dem Datum.

Die numerische Spalte sortiert richtig mit CellTextAt.

Select Case column
Case 2 // Datum
  var date1 as DateTime = Listbox1.RowTagAt(row1)
  var date2 as DateTime = Listbox1.RowTagAt(row2)
  If date1.SecondsFrom1970 > date2.SecondsFrom1970 Then
    result = 1 // true
  else
    result = -1 // false
  End If
  Return True
Case 4 // numerisch
  Var num1 As double = ListBox1.CellTextAt(row1, column).Val
  Var num2 As double = ListBox1.CellTextAt(row2, column).Val
  If num1 > num2 Then
    result = 1
  Else
    result = -1
  End If
  Return True
Else
  Return False
End Select

Meine Empfehlung: nicht im RowTag das Datum speichern, sondern gleich im CellTag der Spalte als Secondsfrom1970.

Dann sieht die Funktion so aus:

Select Case column
  
Case 0 // Date column
  If Val(Me.CellTagAt(row1, column)) < Val(Me.CellTagAt(row2, column)) Then
    result = -1
  ElseIf Val(Me.CellTagAt(row1, column)) > Val(Me.CellTagAt(row2, column)) Then
    result = 1
  Else
    result = 0
  End If
  
  Return True
```

Funktioniert prima. :+1:
Dankeschön!