vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary" 
Autor: Manfred X
Datum: 19.03.14 00:25

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.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Sortier-Reihenfolge falsch trotz "Option Compare Binary"3.701tamaleus17.03.14 03:46
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary"1.996Manfred X17.03.14 12:35
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary"1.949tamaleus18.03.14 23:12
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary"2.016Manfred X19.03.14 00:25
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary"2.068tamaleus19.03.14 02:15
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary"2.114Manfred X19.03.14 05:14
Re: Sortier-Reihenfolge falsch trotz "Option Compare Binary"1.912tamaleus19.03.14 06:23

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel