C# DataGridView Sortieren

Hi,

habe eine Tabelle die Sortiert wird. Es wird so sortiert das die höhere Zahl oben steht. Allerdings denkt das Programm das z.b. 7 höher als alle zahlen unter 79 ist.
this.dataGridView1.Sort(this.dataGridView1.Columns["_Pkt"], ListSortDirection.Descending);
Das ist der Code den ich verwende. Er funktioniert prima, bis man eine einstellige Zahl eingibt (außer 0).
Gibt es irgendwelche lösungen?

hallo

wie das datagrid sortiert wird hängt vom verwendeten algorithmus ab. zahlen sortiert man ja anders als zeichenketten. und zeichenketten können ebenfalls verschiedenartig sortiert werden.

Beispiel (Zeichenkette):
1
15
2
33
38888
45

Beispiel (Zahlen):
1
2
15
33
45
38888

scheinbar ist der default-sortierer des gridviews nicht für deinen zweck geeignet. ich vermute er sortiert den inhalt als zeichenkette, was du aber nicht willst.
du kannst dir jederzeit einen eigenen sortierer schreiben, der den inhalt genau so sortiert, wie du es willst. dazu gibt es die IComparer-Schnittstelle. Erstelle eine neue Klasse, die davon erbt:

public class IntSorter: IComparer {

 int IComparer.Compare( Object x, Object y ) {
 //Entscheidungslogik
 }

 }

diese klasse übergibst du an das gridview beim sortieren:

IComparer myComparer = new IntSorter();
dataGridView1.Sort( myComparer );

in der entscheidungslogik musst du die beiden objekte entsprechend vergleichen und dann -1 (für kleiner), 0 ( für gleich) oder 1 (für größer) zurückgeben.
Die Objekte x und y müssten vom Typ DataGridRow sein, wenn ich mich recht entsinne. also casten, auf die spalte deiner wahl zugreifen, wert auslesen und anhand des wertes -1, 0 oder 1 zurückgeben.

nicht getestet:

public class IntSorter: IComparer {

 int IComparer.Compare( Object x, Object y ) {
 DataGridRow dgr1 = (DataGridRow)x;
DataGridRow dgr2 = (DataGridRow)y;
int v1 = Int32.parse(dgr1["spalte"]);
int v2 = Int32.parse(dgr2["spalte"]);
if(v1\>v2) return 1;
return v1==v2 ? 0 : -1;
 }

 }

Noch eine kleine Anmerkung: Wenn man sicher ist, welche Typen die zu vergleichenden Werte haben, sollte man die Generische Variante benutzen. Damit fällt die Typkonvertierung und bei Wertetypen das Boxing und Unboxing weg:

public class IntSorter: IComparer ...

Nico

danke werd ich ausprobieren :smile:

1 Like