Du möchtest die sortierten Zeilen auch speichern?
In dem Fall könntest die Datenzeilen in der Tabelle über
einen eigenen Comparer sortieren lassen.
Hier ein Beispiel:
Dim rndm As New Random 'Zufallsdaten
'Für Übergabe des CustomComparers
Delegate Function ComparerTTQDelegate _
(ByVal r1 As DataRow, r2 As DataRow) As Integer
Dim myComparerTTQ As New ComparerTTQDelegate _
(AddressOf ComparerTitelTextQuelle)
Public Sub XMain()
'Testdaten erstellen
Dim dt As DataTable = FillTable()
'Datensätze sortieren lassen
Dim dt_sorted As DataTable = _
TableSort.SortedTable(dt, myComparerTTQ)
'Datensätze in einem DatagridView (dgv) anzeigen
dgv.DataSource = dt_sorted
End Sub
Public Function FillTable() As DataTable
Dim dt As New DataTable
With dt.Columns
.Add("Titel")
.Add("Text")
.Add("Quelle")
End With
Dim titel, text As String
For i As Integer = 1 To 20
titel = CreateEntry()
For k As Integer = 1 To 20
text = CreateEntry()
For l As Integer = 1 To 5
dt.Rows.Add(titel, text, CreateEntry)
Next l
Next k
Next i
Return dt
End Function
Private Function CreateEntry() As String
Dim stb As New System.Text.StringBuilder
Dim l As Integer = rndm.Next(3, 12)
For i As Integer = 0 To l
'Hier zu testende Bytefolgen ausgeben lassen
Dim byt As Byte = CByte(rndm.Next(65, 91))
stb.Append(Chr(byt))
Next i
Return stb.ToString
End Function
'Der Comparer für den Vergleich von je zwei Datenzeilen
Public Function ComparerTitelTextQuelle _
(ByVal r1 As DataRow, ByVal r2 As DataRow) As Integer
'ASC
If r1("Titel").ToString > r2("Titel").ToString Then Return 1
If r1("Titel").ToString < r2("Titel").ToString Then Return -1
'ASC
If r1("Text").ToString > r2("Text").ToString Then Return 1
If r1("Text").ToString < r2("Text").ToString Then Return -1
'DESC
If r1("Quelle").ToString > r2("Quelle").ToString Then Return -1
If r1("Quelle").ToString < r2("Quelle").ToString Then Return 1
Return 0
End Function Die Klasse für das Sortieren ...
''' <summary>Erstellt eine neue Datatable in sortierter Reihenfolge</summary>
Public Class TableSort
Shared rndm As New Random(DateTime.Now.Millisecond)
''' <summary>Datensätze der Tabelle sortiert zurückgeben</summary>
Public Shared Function SortedTable(ByVal Table As DataTable, _
ByVal comparer As [Delegate]) As DataTable
Dim l As Integer = Table.Rows.Count - 1
Dim rows(l) As DataRow
Table.Rows.CopyTo(rows, 0)
QuickSort(comparer, rows, 0, l)
Dim dt As DataTable = Table.Clone
For i As Integer = 0 To rows.Length - 1
dt.ImportRow(rows(i))
Next i
Return dt
End Function
''' <summary>Sortierung der Datenzeilen durch Quicksort gemäß
' CustomComparer</summary>
''' <param name="comparer">Delegate für CustomComparer</param>
''' <param name="rows">Referenzliste der zu sortierenden Rows</param>
''' <param name="First">erstes zu sortierendes Element in Rows</param>
''' <param name="Last">letztes zu sortierendes Element in Rows</param>
Private Shared Sub QuickSort(ByVal comparer As [Delegate], _
ByVal rows() As DataRow, _
ByVal First As Integer, ByVal Last As Integer)
Dim i, j, m As Integer
Dim x As DataRow
Dim rv_s As DataRow
i = First : j = Last
m = rndm.Next(First, Last + 1)
x = rows(m)
Do
While CInt(comparer.DynamicInvoke({rows(i), x})) < 0
i += 1
End While
While CInt(comparer.DynamicInvoke({rows(j), x})) > 0
j -= 1
End While
If (i <= j) Then
rv_s = rows(i)
rows(i) = rows(j)
rows(j) = rv_s
i = i + 1 : j = j - 1
End If
Loop Until (i > j)
If (First < j) Then QuickSort(comparer, rows, First, j)
If (i < Last) Then QuickSort(comparer, rows, i, Last)
End Sub
End Class
Beitrag wurde zuletzt am 19.03.14 um 00:26:49 editiert. |