Sortieren eines DataGridView nach mehreren Spalten?
Ich gesucht habe für ein Beispiel zum Sortieren einer DataGridView nach mehreren Spalten, aber nicht zu sein scheinen in der Lage zu finden, ein Beispiel, das tut, was ich möchte.
Grundsätzlich habe ich ein gebundenes DataGridView-control (gebunden an eine DataTable/DataView), und das gebundene DataTable hat zwei Spalten: Priorität und Datum. Ich möchte nach Datum Sortieren innerhalb von Priorität. Das heißt, die Spalte "Priorität" takes precendence, dann werden seine das date, aber beide können aufsteigend oder absteigend sein.
So, ich habe zum Beispiel können niedrige Priorität, das frühe Datum der ersten (Reihenfolge nach Priorität asc, Datum asc), und, indem Sie auf die Spalte Datum, header, schalten Sie auf niedrige Priorität, späte Datum des ersten (Reihenfolge nach Priorität asc, Datum desc). Wenn ich dann auf auf die Priorität, möchte ich mit hoher Priorität zuerst, dann späten Zeitpunkt (die aktuelle Sortierfolge für die Spalte Datum - order by priority desc, Datum desc), aber dann in der Lage sein, um Sie auf die Datum-Spalte-header zu wechseln hohe Priorität, frühe Datum (order by priority desc, Datum asc).
Im Idealfall würde ich gerne Sortieren von Glyphen auf beide Spalten, um zu zeigen, aufsteigend oder absteigend.
Irgendwelche Ideen oder Hinweise wäre dankbar angenommen.
Diese (siehe unten) scheint ziemlich nahe, aber die Glyphen nicht richtig.
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
DataSet1 dataset;
public Form1()
{
InitializeComponent();
dataset = new DataSet1(); //two columns: Priority(Int32) and date (DateTime)
dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("01-jan-10"));
dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("02-jan-10"));
dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("03-jan-10"));
dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("04-jan-10"));
dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("05-jan-10"));
dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("06-jan-10"));
dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("07-jan-10"));
dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("08-jan-10"));
dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("09-jan-10"));
dataGridView1.DataSource = dataset.DataTable1.DefaultView;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;
dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
dataGridView1.Columns[0].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
dataGridView1.Columns[1].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
}
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
DataGridViewColumn[] column = new[] { dataGridView1.Columns[0], dataGridView1.Columns[1] };
DataGridViewColumnHeaderCell headerCell = dataGridView1.Columns[e.ColumnIndex].HeaderCell;
if (headerCell.SortGlyphDirection != SortOrder.Ascending)
headerCell.SortGlyphDirection = SortOrder.Ascending;
else
headerCell.SortGlyphDirection = SortOrder.Descending;
String sort = column[0].DataPropertyName + " " + fnSortDirection(column[0])
+ ", "
+ column[1].DataPropertyName + " " + fnSortDirection(column[1]);
dataset.DataTable1.DefaultView.Sort = sort;
this.textBox1.Text = sort;
}
private String fnSortDirection(DataGridViewColumn column)
{
return column.HeaderCell.SortGlyphDirection != SortOrder.Descending ? "asc" : "desc";
}
}
}
- Was meinst du mit "nicht richtig" im Hinblick auf die Pfeil-Glyphen? Ich habe wirklich nicht die Zeit nehmen wollen, zu schreiben, der Sortieren code, aber ich habe diese nach rechts zu sehen, bevor, und es sieht aus wie du bist auf dem besten Weg dort hin.
- Naja... die Glyphe für die erste Spalte (Priorität) schaltet zwischen oben und unten, aber die Glyphe für die zweite Spalte scheint eine Art von drei-Zustand, und zeigt wie oben, nichts, nichts. Ich vermute, dass der DGV nicht wirklich wie mit zwei Sortier-Glyphen zur gleichen Zeit ? Ich habe eine Dritte Spalte mit "normalen" Sortieren, und das scheint gut, aber (mit den Glyphen auf den ersten beiden Spalten verschwinden), aber Klick auf die überschrift der 2. Spalte, dann gibt mir ein aufsteigender Glyphe ' auf die 1.Säule.
- Google für
MultisortDataGridView
IIRC.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste mal, dass ich dies Lesen, ich habe Total verpasst, das Teil über die Sortierung von mehrere Spalten gleichzeitig (meine Schuld, nicht deine, die Frage war vollkommen klar).
Wenn das der Fall ist, sind Sie gehen zu müssen, den code zu schreiben, der erledigt dies selbst. Die bereitgestellten
DataGridView
control nicht unterstützt multi-Spalten Sortieren standardmäßig. Zum Glück, andere haben bereits viel getan, von der Arbeit zur Umsetzung dieser für Sie. Hier sind ein paar Beispiele:Alternativ, wenn Sie binden Ihre
DataGridView
zu einer Datenquelle die Datenquelle sortiert werden können, auf mehrere Spalten und dieDataGridView
Kontrolle respektiert, dass die Sortierung. Jede Datenquelle, die implementiertIBindingListView
und stellt eineSort
Eigenschaft wird für die Arbeit mit mehreren Spalten Sortieren.Aber, unabhängig von der route, die Sie wählen Sie zum aktivieren der multi-Spalte Sortieren, Sie nicht gehen, um viel Erfolg bei der Nötigung der
DataGridView
zur Anzeige der Art Pfeil-Glyphe auf mehrere Spalten. Die einfachste Lösung ist, um benutzerdefinierte zeichnen nur die Spaltenüberschriften, um Ihre eigene Art Glyphe.Um dies zu tun, fügen Sie einen handler für die
DataGridView.CellPainting
- Ereignis und überprüfen Sie, ob einRowIndex
von -1 (was auf die Kopfzeile einer Spalte). Es gibt eine vollständige Stichprobe von Eigentümer-gezeichnet Spaltenüberschriften hier. Ich empfehle kleben mit der herkömmlichen Pfeil-Symbol, aber wenn Sie diesen Weg gehen, die Möglichkeiten sind wirklich unbegrenzt. Sie können Ihre Spaltenüberschriften Aussehen, was Sie wollen, und auch zeigen die relative Gewichtung jeder Spalte in der Art, um mit verschiedenen icons.Können Sie auch wählen, um eine neue Klasse ableiten, aus
DataGridViewColumnHeaderCell
und überschreiben Sie dieFarbe
Methode. Dies ist wahrscheinlich ein cleaner, mehr Objekt-orientierten Art und Weise zu bewerkstelligen.Wenn DataGridView bindet an die DataSource (DataView, BindingSource, Tabelle, Datensatz+"tablename") in allen Fällen ist es refere der DataView. Verweis auf das DataView-Objekt, und legen Art (und Filter), wie Sie wünschen:
Hinweis: Spalte Namen Sortieren und Filtern entsprechen den Namen der Spalten in der DataTable,
Spaltennamen in der DataGridView werden die zugrunde liegenden Daten Namen der Eigenschaft für die Bindung verwendet (property Namen für Klassen, die Spaltennamen für Datentabellen, etc.). Erhalten Sie die Spalte name verwendet DataView wie diese:
Hängt davon ab, wie wollen Sie verfolgen sortierten Spalten (colSequence, colName, asc/desc, dgvColIdx) können Sie entscheiden, wie Sie bauen, Sortieren und Filtern-Ausdruck und legen Sie die SortGlyph im dgv (ich habe ein fest für die Einfachheit).
Ok.
Folgenden von Cody ' s Kommentaren oben, ich habe jetzt etwas, das scheint zu funktionieren wie erwartet. Ich habe untergeordnetes den HeaderCell und über Gefahren der Paint-Methode (aber betrogen, indem die SortGlyphDirection unmittelbar vor der Basis.Farbe) und der DGV nun mehrere Farben Sortieren Glyphen.
Ich habe noch nie eine Frage beantwortet, die hier, so dass ich entschuldige mich, wenn das format falsch ist, aber ich fand die Antwort auf diese Frage, die ist vielleicht einfacher für zukünftige Besucher. (Siehe http://www.pcreview.co.uk/threads/datagridview-glyphs.3145090/ )
Hier ist ein Beispiel, das funktioniert wie google-Tabellen - Klick auf jede Spaltenüberschrift sortiert nach dieser Spalte, und klicken Sie erneut auf den Spaltenkopf kehrt die Suchrichtung. Darüber hinaus sucht es in umgekehrter Reihenfolge von der Geschichte, wie Sie klicken auf die Spalten, D. H. wenn Sie auf die Spalte D, dann B, dann C, dann A, auf, dass nach dem letzten Klick erfolgt die Sortierung nach Spalten A, C, B, D, und die Richtung für jeden, der es suchte, wenn Sie zuletzt geklickt haben auf die Spalte.
Er setzt auf diese Merkmale eingebaut, um die "DataGridView":
Starten wir mit einem sorter Objekt:
Dann sammeln Sie unsere Sorter-Objekte in einem Sortierer Klasse:
Und ich mache meine eigene MultiSortingDataGridView Klasse, ableiten von DataGridView, mit einer überschriebenen Methode "Sort", die verfolgt, welche Spalten, die Sie angeklickt haben auf, und verursacht eine Art der DataView, ist die gebundene Datenquelle meines Rasters, basierend auf der Geschichte Ihrer Spalte Sortieren Klicks:
Dann in meiner form, ich sicherstellen, dass ich eine MultiSortingDataGridView Kontrolle (wie oben), statt der regulären DataGridView, und ich seine Daten Quelle: