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?
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
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
```