DataGridView nach Datum sortieren



  • Hallo!

    Ich schaffe es nicht, ein Datum in einer DataGridView "ordentlich" zu sortieren.
    Die Daten werden als DateTime aus der DB abgerufen und wie folgt an die DataGridView übergeben:

    string[] row = { item.id.ToString(), item.pnummer.ToString(), item.pname.ToString(), item.termin.ToShortDateString() };
    

    Allerdings wird dann das Datum nicht richtig sortiert.

    Ändere ich den Termin so ab:

    String.Format("{0:s}", item.termin
    

    wird richtig sortiert! Allerdings sieht dann ein Datum sehr unleserlich aus 2016-12-10T 00:00:00

    Der Versuch

    String.Format("{0:s}", item.termin.ToShortDateString()
    

    führt wieder zu einer nicht sortierten Datumsspalte.

    Kann mir bitte jemand helfen?? 😕



  • Hallo

    Dein Problem ist deine nicht notwendige Wandlung des Datums in eine Zeichenfolge. Als Beispiel, wenn du die zwei Werte 1.2.2016 und 2.1.2016 hast, wird nach der Wandlung in eine Zeichenfolge die Darumswerte, wie jede Zeichenfolge, von links gehend verglichen. Dabei ist eben die 1 < 2, wodurch der 1.2 vor dem 2.1 kommt.

    Leg deine Faten in ein Objekt-Array und lass das ToShortDateString weg. Die Formatierung des Datums legst du dann am DataGridView an der zugehörigen Spalte fest.

    Grus Marco



  • Das Problem habe ich verstanden, allerdings weiß ich immer noch nicht recht wie lösen.

    Wie soll ich dann die Daten an die DataGridView binden

    string[] row = { item.id.ToString(), item.pnummer.ToString(), item.pname.ToString(), item.termin.ToShortDateString() };
    

    ohne das Datum in einen String umzuwanden?

    Lass ich .ToShortDateString() weg, so erhalte ich die Fehlermeldung Eine implizite Konvertierung vom Typ "System.DateTime" in "string" ist nicht möglich.

    Tut mir leid, ich komme echt nicht weiter 😞



  • Du solltest dir eine Klasse für die Daten erstellen und dann eine Liste davon an das DGV binden (es macht bisher ja keinen Sinn, daß du eine einzelne Zeile an das DGV bindest).



  • Hallo

    Du hast 2 Möglichkeiten. Die einfache ist statt deinem string[] nimmst du object[], z.B:

    object[] row = { item.id, item.pnummer, item.pname, item.termin;
    

    Oder du bindest direkt das item an dein Grid.

    Bei beiden Wegen, ist aber noch offen, wie du mehrere Zeilen in dein Grid aktuell bekommst?

    Grus Marco



  • @Marc-O
    Vielen vielen Dank!!
    Mit object[] funktioniert es nun prima!

    Mehrere Zeilen sind eigentlich kein Problem. Ich durchlaufe mit foreach eine Liste (diese kann ich nicht direkt binden, da ich noch Daten aus weiteren Listen abrufe) und nach jedem Durchlauf hände ich mit

    dataGridView.Rows.Add(row0);
    

    eine weitere Zeile an.



  • Jetzt habe ich leider wieder ein Problem mit dem Sortieren eines Datums in einer DataGridView.
    So habe ich wie von Th69 vorgeschlagen, nun die Daten der Klasse an eine List gebunden

    List<Position> list = DB_Abfrage.PositionenListe(iId);
    dataGridView1.DataSource = list;
    

    Allerdings konnte ich dann gar nicht sortieren. Ebenso wenn ich Daten als BindingSource gebunden habe.

    Bedeutet das, dass ich dann immer eine eigene Sort Methode schreiben muss? Oder habe ich etwas grundsätzlich falsch bei der Datenbindung gemacht?

    Als weitere Frage noch: Eigentlich habe ich bisher die Daten mit foreach zeilenweise hinzugefügt, da ich zu jeder Position noch eine separate DB Abfrage mache, um ebenfalls den Wert zu ermitteln. Ist dies grundsätzlich schlecht bzw. sollten diese Daten eigentlich schon in der ersten Klasse ermittelt werden?


Anmelden zum Antworten