Laden...

Databound DataGridView ohne BindingList sortieren

Erstellt von Rahvin vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.095 Views
R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 11 Jahren
Databound DataGridView ohne BindingList sortieren

Hallo zusammen,

ich schlage mich mal wieder mit der schönen Datagridview rum 😉.

Ich habe ein datengebundenes Datagridview und möchte dieses gerne nun per Klick auf einen Spaltenkopf sortieren können. Ich musste jetzt leider feststellen dass das gar nicht ohne weiteres möglich ist.

Die einzige Möglichkeit die ich bis jetzt gefunden habe ist eine BindingList zu verwenden. Das ist mir auf Grund der Daten und der Umstellung eines laufenden Programmes aber gar nicht recht.

Bevor ich eine Bindinglist verwende würde ich sogar eher die Daten erneut und entsprechend sortiert aus der Datenbank abfragen.

Daher die Frage, gibt es irgendeine andere Möglichkeit die Daten im Dateviewgrid zu sortieren?

4.931 Beiträge seit 2008
vor 11 Jahren

Hallo Rahvin,

an welche Komponente hast du denn deine DGV gebunden (BindingSource, DataView, DataTable)? Bei den ersten beiden brauchst du dann nur die Sort-Eigenschaft entsprechend setzen.

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 11 Jahren

Ich packe eine Datenbankafrage in eine List<Z> und hänge diese dann ans Datagridview:


...
                List<UserKMAdresse> lstAlleAdressen = (from a
                                                       in context.UserKMAdresses
                                                       where a.UserKMKampagne_ID == this._activeKampagne.ID
                                                       select a).ToList();

...


dgv.DataSource = lstAlleAdressen;

Wenn ich jetzt Sort aufrufe erhalte ich folgenden Fehler:> Fehlermeldung:

Das DataGridView-Steuerelement muss an ein IBindingList-Objekt gebunden sein, um sortiert zu werden.

C
5 Beiträge seit 2012
vor 11 Jahren

Hi,

du hast anscheinend einen kleinen Denkfehler.

Deine DataSource sollte "lstAlleAdressen" sein und nicht lstAdressen.

VG,
Chris

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 11 Jahren

Sorry, war ein Copy & Paste Fehler in meinem Post. Es gibt verschieden Listen und je nach Benutzeraktion wird eine andere an das Datagridview gehängt. Der Code ist richtig, ich hab nur die falsche Stelle gepostet.

Edit: Ich hab das Codebeispiel geändert.

F
10.010 Beiträge seit 2004
vor 11 Jahren

Sortieren in einem DGV geht nur wenn die gebundene Liste IBindingList implementiert.

Wenn Du das brauchst und vorher nicht die richtigen Grundlagen hattest um das zu wissen, musst du jetzt halt mehr arbeiten.

Benutze statt BindingList eine ObservableCollection.

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 11 Jahren

Ich habs befürchtet.

Ich hab jetzt nochmal ein bißchen gegoogelt aber so ganz verstehe ich das Problem nicht und warum man unbedingt eine BindingList braucht.

Würde es also theoretisch reichen wenn ich diesen Code:


List<UserKMAdresse> lstAlleAdressen = (from a
                                in context.UserKMAdresses
                                where a.UserKMKampagne_ID == this._activeKampagne.ID
                                select a).ToList();

so abändere:


BindingList<UserKMAdresse> lstAlleAdressen = (from a
                                           in context.UserKMAdresses
                                           where a.UserKMKampagne_ID == this._activeKampagne.ID
                                           select a).ToList();

Quick and Dirty hat das zumindest zur gleichen Fehlermeldung geführt.

UserKMAdresse ist übrigens eine autogenerierte Linq-Klasse.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Rahvin,

es kommt nicht auf den statischen Typ der Variable an, sondern darauf, dass in der Variablen tatsächlich ein Objekt steckt, das IBindingList implementiert. Dann sollte es gehen. Im Zweifel erzeugst du ein passendes Objekt per new und fügst ihm die gewünschten Elemente hinzu.

herbivore

Y
238 Beiträge seit 2005
vor 11 Jahren

Hallo Rahvin,

versuche doch einfach mal das entsprechende Klick-Ereignis vom Spaltenkopf bzw. DataGrid zu abonieren und mache dann sowas wie:


/// (Pseudocode):
private void SpaltenkopfKlickHandler(object sender, IrgendwelcheEventArgs e)
{
    DataGridView grid = sender as DataGridView;
    IList list = grid.DataSource as IList;
    list.Sort(e.Ascending);
    grid.DataSource = null;
    grid.DataSource = list;
    grid.Refresh();
}

Oder wie herb es vorschlägt kannst du deine Liste in eine BindingList reinpacken und and das Grid binden grid.DataSource = new BindingList(deineListe);
Grüßle

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 11 Jahren

Ich habs jetzt über eine BindingList gelöst. Es war gar nicht so kompliziert wie ich gedacht habe.

Ich übertage einfach die Einträge meiner List<T> in die BindingList und lege diese dann als DataSource des DataGridViews fest.

Trotzdem wundert es mich, dass das DataGridView das Sortieren von einfachen Typen wie strings oder ints nicht von Hause aus unterstützt. Mit nicht datengebundenen Einträgen klappt es doch auch.

Ich danke Euch jedenfalls für die Tips.

@yngwie:
Das wäre auch schön einfach und einen Versuch wert gewesen aber als ich Deinen Post gelesen habe, hatte ich schon die BindingList implementiert 😉.