gebundenes DGV nach mehreren Spalten sortieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von prinzip.

    gebundenes DGV nach mehreren Spalten sortieren

    Hallo,

    ich suche nach einer Möglichkeit, ein gebundenes DataGridView nach mehreren Spalten zu sortieren.
    Wenn es in der Spalte für die Sortierung doppelte Einträge gibt, soll nach eine Spalte mit "ID" Nr. sortiert werden.

    Die Sortierung erfolgt wie folgt und bezieht sich eben nur auf eine Spalte.

    VB.NET-Quellcode

    1. DataGridView1.Sort(DataGridView1.Columns(10), System.ComponentModel.ListSortDirection.Ascending)


    Gibt es eine Möglichkeit, bei doppelten Einträgen in dieser Spalte nach 'ID' = Columns(0) zu sortieren?

    Der folgende gefundene Code führt offenbar nicht zum gewünschten Ergebnis:

    Visual Basic-Quellcode

    1. Private Sub DataGridView1_SortCompare( _
    2. ByVal sender As Object, ByVal e As DataGridViewSortCompareEventArgs) _
    3. Handles DataGridView1.SortCompare
    4. ' Try to sort based on the contents of the cell in the current column.
    5. e.SortResult = System.String.Compare(e.CellValue1.ToString(), _
    6. e.CellValue2.ToString())
    7. ' If the cells are equal, sort based on the ID column.
    8. If (e.SortResult = 0) AndAlso Not (e.Column.Name = "ID") Then
    9. e.SortResult = System.String.Compare( _
    10. DataGridView1.Rows(e.RowIndex1).Cells("ID").Value.ToString(), _
    11. DataGridView1.Rows(e.RowIndex2).Cells("ID").Value.ToString())
    12. End If
    13. e.Handled = True
    14. End Sub


    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Vielen Dank für den Lösungsansatz.
    Ich habe in anderen Beispielen Möglichkeiten für eine multible Sortierung gefunden.
    In meinem Projekt, welches auf die folgende sortierbare datengebundene Liste basiert, fehlen mir leider die Ansätze, etwas derartiges umzusetzen.
    Generic sortable binding list in VB

    Einfach sortieren kann ich damit eben nur wie folgt:

    VB.NET-Quellcode

    1. Me.DataGridView1.DataSource = DataGridView1.DataSource
    2. Me.DataGridView1.DataSource = New SortableBindingList(Of PopName)(Names)
    3. Me.DataGridView1.Sort(Me.DataGridView3.Columns(6), System.ComponentModel.ListSortDirection.Ascending)


    Wenn ich doppelt z.B.:

    VB.NET-Quellcode

    1. Me.DataGridView1.Sort(Me.DataGridView3.Columns(0), System.ComponentModel.ListSortDirection.Ascending) 'Spalte mit durchgehenden Nummern
    2. Me.DataGridView1.Sort(Me.DataGridView3.Columns(6), System.ComponentModel.ListSortDirection.Ascending) 'Spalte mit Mannschaftsnamen

    verwende, wird primär immer noch wie gewünscht nach Spalte 7 sortiert bzw. gruppiert. Obwohl die Sortierung von der der einfachen Variante oben abweicht, wird sekundär aber immer noch nicht nach Spalte 1 sortiert. :?:

    So kann man mehrere Sortierungen hintereinander setzen, wobei nur die letzte funktioniert. Die vorhergehende Sortierung führt lediglich zu in sich konstanten Abweichungen innerhalb doppelter Einträge, welche jeweils nicht schlüssig bzw. nachvollziehbar sind.
    Die Sortierung per Kopfzeile habe ich übrigens abgeschaltet, da diese ausschließlich per Code vorgegeben werden soll.
    ich würd dir empfehlen, deine SortableList mal beiseite zu lassen, und einfach zu machen, was MichaHo vorschlägt.
    Das baut aber auf Datasets auf, vorzugsweise auf typisierten Datasets.
    Die bieten Unterstützung für alle möglichen Anforderungen an Datenklassen, u.a. auch hierarchische Sortierung.

    Also ehe du da das Rad neu erfindest...



    Naja - wie dem auch sei. Dein Denkfehler ist, dass du das DGV sortieren willst statt der Daten.
    @ErfinderDesRades Soweit bin ich leider noch lange nicht, dass ich irgend etwas neu erfinden könnte. :/
    Dein Vorschlag hört sich für ein recht weit fortgeschrittenes Projekt nach viel Arbeit an. Ich verwende eine TabPage, wo über aktuell 8 Reiter relevante Einträge der Datenbank gefiltert und sortiert werden. Außerdem lade ich die Source aus DataGridView1 immer mal wieder in ein unsichtbares DGV, um dort im Hintergrund verschiedene Berechnungen und Platzierungen durchzuführen (Leistungserfassung im Sportbereich). Da musste wohl einiges umgebaut werden. Ein einfacher Austausch des SortableBindingList-Moduls reicht da wohl kaum. Übrigens ist mir beim experimentieren mit dem ursprünglichen Basis-Beispiel wieder aufgefallen, dass es da die Warnung:
    Warnung 1 Der T-Typparameter hat den gleichen Namen wie ein Typparameter eines einschließenden Typs. Für den Typparameter des einschließenden Typs wird Shadowing durchgeführt. D:\Downloads\VB\Generic sortable binding list in VB\VB\GenericSortedBindingList\SortableBindingList.vb 56 31 GenericSortedBindingList
    gab. Ich habe seinerzeit einfach ein T durch ein X ersetzt, ohne dass es dadurch irgendein sichtbares Fehlverhalten gab.

    VB.NET-Quellcode

    1. #Region " Property comparer "
    2. Private Class PCompare(Of X)
    3. Implements IComparer(Of T)
    4. Private Property PropInfo As PropertyInfo
    5. Private Property SortDir As ListSortDirection

    Sinn macht dies so aber sicherlich auch nicht. :huh:

    Obwohl die Möglichkeiten in diesem Beispiel docs.microsoft.com/de-de/dotne…orms-datagridview-control vielversprechend aussahen, lässt es sich hier offenbar nicht verwenden. In der zweiten Variante wird das SortCompare Ereignis bei mir gar nicht erst ausgelöst. Ansonsten würde es laut Beschreibung ja genau meinen Zweck erfüllen. In der dritten Variante heißt es dann wieder, dass der Vergleich für den Sortiervorgang im datengebundenen DataGridView-Steuerelement nicht möglich ist. :(

    So suche ich also weiter nach dem passenden Rad. ;)

    Edit:
    Das SortCompare Ereignis kann ja so gar nicht ausgelöst werden.
    The SortCompare event does not occur when the DataSource property is set or when the VirtualMode property value is true.

    Irgendwie drehe ich mich im Kreis

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „prinzip“ ()

    prinzip schrieb:

    Irgendwie drehe ich mich im Kreis
    Jo - wies aussieht ist dein Projekt deinen Kenntnissen davongelaufen.
    IMO musste ganz neu anfangen zu lernen. Weil deinen Kern-Fehler habich ja schon benannt:

    ErfinderDesRades schrieb:

    Dein Denkfehler ist, dass du das DGV sortieren willst statt der Daten.
    Und wenn dann sowas kommt:

    prinzip schrieb:

    aus DataGridView1 immer mal wieder in ein unsichtbares DGV, um dort im Hintergrund verschiedene Berechnungen und Platzierungen durchzuführen
    ...dann ist offsichtlich, dass du Daten nicht von Steuerelementen unterscheiden kannst, bzw. dir diese Verwechslung/Vermanschung schon tiefgehend angewöhnt hast.
    Da wird es sehr hart mit dem Umlernen.
    Und beim Umbau bleibt dann auch kein Stein auf dem anneren.

    ErfinderDesRades schrieb:

    Zitat von prinzip: „Irgendwie drehe ich mich im Kreis“Jo - wies aussieht ist dein Projekt deinen Kenntnissen davongelaufen.
    IMO musste ganz neu anfangen zu lernen. Weil deinen Kern-Fehler habich ja schon benannt: Zitat von ErfinderDesRades: „Dein…

    Da hast Du sicherlich recht. So ist es, wenn man ein etwa 4 Jahre altes Projekt aus Grundlage für ein neues verwendet. Ich habe auch erst mal eine Weile benötigt, um meine eigenen Prozeduren etc. wieder zu verstehen. =O Inzwischen ist mir das aber wenigsten gelungen und ich kommentiere nun immer konsequent. Das ist ja auch schon mal ein kleiner Lerneffekt. Komplett neu aufbauen muss ich demnächst auch alte VB6 Projekte, damit ich moderne Technologien aus vb.net nutzen kann und es unter neueren OS lauffähig bleibt. 8|

    Zum aktuellen Thema ist mir aber zunächst eine alternative Lösung eingefallen. Ich habe eine bislang ungenutzte Spalte mit Inhalten vom Typ Integer. So kann ich beim Laden der Daten die Datensätze jeweils nach dem ersten Sortierkriterium gruppiert und in sich passend nach dem zweiten Sortierkriterium sortiert durchnummerieren. Nach den Inhalten dieser 'unsichtbaren' Spalte sortiert habe ich dann die gewünschte Sortierung. Auch wenn es nicht gerade trivial ist, so funktioniert dies erst aber mal. Die Sortierung ist auch nicht elementar im Projekt, dient aber der Ergonomie in Sachen Bedienung, worauf ich grundsätzlich viel Wert lege. :) Bei maximal 120 Datensätzen sollte die Performance auch keine Probleme bereiten.