CF 3.5, VS08 Pro Dobrý den, měl bych dotaz(prosbu) potřeboval bych setřídit data v DataTablu. Jelikož CF nemá nějako třídící funkci jako listOf (.Sort) pro DT, nebo o ní nevím, zkoušel jsem si napsat něco vlastního. Řádky tabulky jsem načetl do pole řádků, porovnal dle potřeby a chtěl jsem je naklopit zpět do tabulky.
''' <summary>
''' Třídění dat v DT
''' </summary>
''' <param name="dt">třízená DT</param>
''' <remarks></remarks>
Private Sub SortDataTable(ByRef dt As DataTable)
'Vytvoření pole řádků
Dim r(dt.Rows.Count - 1) As DataRow
'Načtení dat z tabulky do pole
For i As Integer = 0 To dt.Rows.Count - 1
r(i) = dt.NewRow
r(i) = dt.Rows(i)
Next
'Setřízení
Array.Sort(r, AddressOf Me.CompareDtRow)
'Naplnění dat zpět do tabulky
For i As Integer = 0 To dt.Rows.Count - 1
With dt.Rows(i)
.Item("Name") = r(i).Item("Name")
.Item("Type") = r(i).Item("Type")
.Item("CZType") = r(i).Item("CZType")
.Item("Revo") = r(i).Item("Revo")
.Item("Lead") = r(i).Item("Lead")
End With
Next
End Sub
''' <summary>
''' Porovnávací funkce
''' </summary>
Private Function CompareDtRow(ByVal x As DataRow, ByVal y As DataRow) As Integer
If x.Item("Type") > y.Item("Type") Then
Return 1
ElseIf x.Item("Type") < y.Item("Type") Then
Return -1
Else
If x.Item("Name") > y.Item("Name") Then
Return 1
ElseIf x.Item("Name") < y.Item("Name") Then
Return -1
Else
Return 0
End If
End If
End Function
Podle toho co jsem vysledoval se data v poly srovnají jak mají, ale když je začnu nahrávat zpět do DT tak v průchodu druhým cylkem (i = 1) po '.Item("Type") = r(i).Item("Type")' se v poly (z pro mě nepochopitelných důvodů) zkopíruje obsah r(1) do r(2). Setkal se s tím někdo, nebo neznáte nějaký lepší způsob na seřazení DataTablu ? Ps.: Pro testovací účely mám pouze tři řádky v DT a ladím na Windows Mobile 6 Pro Emulator. Jedno vlákno.
|