Ein DataGridView für mehrere Spalten sortieren?

8

Ich habe nach einem Beispiel gesucht, um ein DataGridView auf mehreren Spalten zu sortieren, aber scheint kein Beispiel zu finden, das mir gefällt.

Grundsätzlich habe ich ein gebundenes DataGridView-Steuerelement (an eine DataTable / DataView gebunden), und die gebundene DataTable hat zwei Spalten: - Priorität und Datum. Ich möchte nach Priorität sortieren. Das heißt, die Prioritätsspalte hat Vorrang, dann das Datum, aber beide können aufsteigend oder absteigend sein.

So habe ich zum Beispiel eine niedrige Priorität, frühes Datum zuerst (Reihenfolge nach Priorität asc, Datum asc) und durch Klicken auf die Überschrift der Datumsspalte zu niedriger Priorität, spätes Datum erste (Reihenfolge nach Priorität asc, Datum desc) . Wenn ich dann auf die Priorität klicke, möchte ich zuerst eine hohe Priorität haben, dann ein spätes Datum (die aktuelle Sortierreihenfolge für die Datumsspalte - Reihenfolge nach Priorität desc, date desc) , dann aber können Klicken Sie auf die Überschrift der Datumsspalte, um zu hoher Priorität zu wechseln, frühes Datum (Reihenfolge nach Priorität desc, Datum asc) .

Idealerweise möchte ich Glyphen in beiden Spalten so sortieren, dass sie aufsteigend oder absteigend angezeigt werden.

Irgendwelche Ideen oder Hinweise würden dankbar empfangen.

Das (siehe unten) scheint ziemlich nahe zu kommen, aber die Glyphen funktionieren nicht richtig.

%Vor%     
Black Light 10.01.2011, 12:35
quelle

4 Antworten

3

Ok.

Nach Codys obigen Vorschlägen habe ich jetzt etwas, das wie erwartet funktioniert. Ich habe die HeaderCell unterklassifiziert und die Paint-Methode übersteuert (aber umgangen, indem ich die SortGlyphDirection direkt vor base.Paint gesetzt habe) und der DGV malt jetzt mehrere Sortierzeichen.

%Vor%     
Black Light 11.01.2011, 12:49
quelle
7

Als ich das zum ersten Mal gelesen habe, habe ich den Teil über das gleichzeitige Sortieren nach multiple Spalten total vermisst (mein Fehler, nicht dein; die Frage war vollkommen klar).

Wenn das der Fall ist, müssen Sie den Code schreiben, der das selbst erledigt. Das bereitgestellte DataGridView -Steuerelement unterstützt standardmäßig keine mehrspaltige Sortierung. Zum Glück haben andere bereits viel getan, um dies für Sie umzusetzen. Hier sind ein paar Beispiele:

Alternativ können Sie, wenn Sie Ihre DataGridView an eine Datenquelle binden, diese Datenquelle in mehreren Spalten sortieren, und das DataGridView -Steuerelement berücksichtigt diese Sortierung. Jede Datenquelle, die IBindingListView implementiert und eine Eigenschaft Sort verfügbar macht, funktioniert für die Sortierung mit mehreren Spalten.


Unabhängig von der Route, die Sie auswählen, um die Sortierung nach mehreren Spalten zu aktivieren, wird es Ihnen jedoch nicht gelingen, DataGridView so zu steuern, dass das Sortierpfeil-Symbol in mehreren Spalten angezeigt wird. Die einfachste Lösung besteht darin, nur die Spaltenüberschriften benutzerdefiniert zu zeichnen, um ein eigenes Sortierzeichen zu erhalten.

Hängen Sie dazu einen Handler an das DataGridView.CellPainting -Ereignis an und prüfen Sie auf RowIndex -1 (Angabe einer Spaltenüberschrift). Es gibt ein vollständiges Beispiel für vom Besitzer gezeichnete Spaltenüberschriften hier . Ich empfehle dringend, mit dem herkömmlichen Pfeil-Symbol zu bleiben, aber sobald Sie diesen Weg gehen, sind die Möglichkeiten wirklich unbegrenzt. Sie können Ihre Spaltenüberschriften wie gewünscht aussehen lassen und sogar das relative Gewicht jeder Spalte in der Sortierreihenfolge mithilfe verschiedener Symbole angeben.

Sie können auch eine neue Klasse von DataGridViewColumnHeaderCell und überschreiben Sie die Methode Paint . Dies ist wahrscheinlich ein sauberer, objektorientierter Weg, um dasselbe zu erreichen.

    
Cody Gray 11.01.2011 05:22
quelle
4

Wenn DataGridView an die DataSource ( DataView, BindingSource, Tabelle, DataSet + "Tabellenname" ) gebunden ist, wird in allen Fällen auf < DataView . Beziehen Sie sich auf diese DataView und setzen Sie Sortieren (und Filter ) nach Ihren Wünschen:

%Vor%

Hinweis: Spaltennamen, die in Sort und Filter verwendet werden, entsprechen den Spaltennamen in DataTable . Spaltennamen in DataGridView sind die zugrunde liegenden Dateneigenschaftsnamen, die für die Bindung verwendet werden (Eigenschaftsnamen für Klassen, Spaltennamen für DataTables usw.). Sie können den in DataView verwendeten Spaltennamen wie folgt erhalten:

%Vor%

Abhängig davon, wie Sie sortierte Spalten verfolgen möchten (colSequence, colName, asc / desc, dgvColIdx), können Sie entscheiden, wie Sie den Sort- und Filter-Ausdruck erstellen und den SortGlyph in dgv setzen (ich habe Hardcode zur Vereinfachung gemacht). p>     

parfilko 22.02.2012 18:10
quelle
2

Ich habe hier noch nie eine Frage beantwortet, also entschuldige ich mich, wenn das Format falsch ist, aber ich habe eine Antwort auf diese Frage gefunden, die für zukünftige Besucher einfacher sein könnte. (Siehe Ссылка )

%Vor%     
Mh4 05.06.2015 15:12
quelle

Tags und Links