Benutzer mit den meisten Antworten
Sortieren eines Datagridview mit gebundenen Daten durch Klicken auf Spaltenüberschrift

Frage
-
Hallo Experten,
Ich möchte dem User die Möglichkeit geben ein gebundenes Datagridview durch Klicken auf eine Spaltenüberschrift zu sortieren.
Bei DataGridView.Sort(....) bekomme ich diese Exception
Das DataGridView-Steuerelement kann nicht sortiert werden, wenn es an eine IBindingList gebunden ist, die das Sortieren nicht unterstützt.
BindingSource.Sort(.....) kann ich zwar speichern, ändert aber die Reihenfolge des Bindingsource nicht.
So werden die Daten beim ersten Aufruf geladen:
bers = context.Beraters .Where(b => b.AbteilungID == _login.Abteilungsnummer) .OrderBy(b => b.FamName) .ThenBy(b => b.Vorname) .ToList(); beraterBindingSource.DataSource = bers;
Damit sind die Daten nach Familienname und Vorname sortiert. Wenn der User auf die Spalte Beraternummer klickt sollen die Daten jetzt nach Beraternummer sortiert werden:
private void beraterDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { string datapropertyname = ""; DataGridViewColumn dgvc = (DataGridViewColumn)beraterDataGridView.Columns[e.ColumnIndex]; if (dgvc.DataPropertyName != null) { datapropertyname = dgvc.DataPropertyName; if (datapropertyname == "Beraternummer") { beraterBindingSource.Sort = "Beraternummer ASC"; beraterDataGridView.DataSource = beraterBindingSource; beraterDataGridView.Refresh(); } } }
Das hat jedoch überhaupt keine Auswirkung auf die Anzeige. Eine Funktion die das Sortieren ausführen soll, habe ich im Bindingsource nicht gefunden.
Ich verwende VS2015 SP1 und Entity Framework 6.
Kann mir jemand sagen wie ich das bewerkstelligen kann?
Viele Grüße
Siegfried
- Bearbeitet Siegfried Reichmann Sonntag, 8. Mai 2016 13:50
Antworten
-
Hi Siegfried,
um mit dem Spaltenklick eine sortierte Anzeige zu bekommen, muss man entweder eine Sicht auf eine im Speicher vorhandene Menge von Datenobjekten haben (List, DataTable o.ä.) oder beim Aufruf direkt aus der Datenbank sortiert abrufen (orderby).Im ersten Fall musst Du die abgerufenen Datensätze persistieren (z.B. ToList), dann eine Sicht erzeugen und diese für die Anzeige nutzen. Die Zuweisung einer Liste zur BindingSource erzeugt implizit eine Sicht und den passenden CurrencyManager dazu.
Im zweiten Fall musst Du den Sort-Klick abfangen und aus dessen Parametern einen Ausdrucksbaum erzeugen, der dann für den Abruf der Daten genutzt wird.
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut- Als Antwort markiert Siegfried Reichmann Sonntag, 8. Mai 2016 18:12
Alle Antworten
-
Hi Siegfried,
um mit dem Spaltenklick eine sortierte Anzeige zu bekommen, muss man entweder eine Sicht auf eine im Speicher vorhandene Menge von Datenobjekten haben (List, DataTable o.ä.) oder beim Aufruf direkt aus der Datenbank sortiert abrufen (orderby).Im ersten Fall musst Du die abgerufenen Datensätze persistieren (z.B. ToList), dann eine Sicht erzeugen und diese für die Anzeige nutzen. Die Zuweisung einer Liste zur BindingSource erzeugt implizit eine Sicht und den passenden CurrencyManager dazu.
Im zweiten Fall musst Du den Sort-Klick abfangen und aus dessen Parametern einen Ausdrucksbaum erzeugen, der dann für den Abruf der Daten genutzt wird.
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut- Als Antwort markiert Siegfried Reichmann Sonntag, 8. Mai 2016 18:12
-
Hi Peter,
ich habe micht für die erste Variante entschieden die ich schon in Erwägung gezogen hatte. Ich dachte aber, dass es vielleicht eine einfache Möglichkeit zum Sortieren vom Bindingsource geben würden.
Vielen Dank und schonen Sonntag noch.
Siegfried
-
Hi Siegfried,
die BindingSource kann nicht sortiert werden, da sie keine Daten zum Sortieren hat. Sie ruft die Daten aus einer Datenquelle ab. Wenn die Datenquelle persistiert vorliegt, wird implizit eine Sicht erzeugt (DataView). Die Sicht ist ein über die persistierten Daten übergestülpter Index, der es ermöglicht, die Daten in einer bestimmten Reihenfolge abzurufen (Sort) oder nur einige der Daten abzurufen (Filter).--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut