• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

[C#] RowHeader Sortierungs Problem!

Xortex

Anwärter/in
Mitglied seit
09.01.2005
Beiträge
22
Reaktionspunkte
0
Hallo,
ich habe eine Problem.
Ich habe ein DataGridView in dem ich links im Rowheader das Datum quasi als Betitelung jeder Row anzeigen lasse.
Nun sortiert die DGV jede ROW nach dem Datum (welches aber als String interpretiert wird, wird das falsch soriert)

Wie kann ich diese Sortierung aendern ?

Wenn ich da anstatt eines Strings ein Datum einfuege zeigt es nichts an

Wenn ich den ValueType von der RowHeaderCell aendern will aendert sich nichts.

Hat jemand ne Ahnung ?

Code:
Fuelle den Header so:

edit_grid_timedata.Rows[edit_grid_timedata.Rows.Count - 1].HeaderCell.Value = tmpDate.ToString("yyyy-MM-dd ddd");
Ich hab auch schon ueberlegt einfach das Datum anders zu gestallten ( als string)
aber er macht bei der Sortierung immer was falsch :-/

Vielen Dank
Xortex
 
Du musst deine eigene Klasse schreiben, die du beim sort() übergeben kannst, damit das richtig sortiert wird. Diese Klasse muss den IComparer implementieren.

Hier mal ein Quick´n´Dirty (Noch verbesserungswürdig, vor allem Fehler fangen, wenn es kein DateTime ist, und die Parse-Zeile gefällt mir auch noch nicht wirklich....)

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            dataGridView1.Rows.Add("05.08.2008", "blubb1");
            dataGridView1.Rows.Add("20.12.2059", "blubb2");
            dataGridView1.Rows.Add("14.05.1999", "blubb3");

            dataGridView1.Sort(new Datums_comparer());

        }
    }


    public class Datums_comparer : IComparer
    {
        int IComparer.Compare(Object x, Object y)
        {
            DateTime dt_x = DateTime.Parse(((DataGridViewRow)x).Cells[0].Value.ToString());
            DateTime dt_y = DateTime.Parse(((DataGridViewRow)y).Cells[0].Value.ToString());

            if (dt_x.Ticks < dt_y.Ticks)
            {
                return -1;
            }
            else if (dt_x.Ticks > dt_y.Ticks)
            {
                return 1;
            }
            else
            {
                return 0;
            }

        }

    }

}

Sollte dann gehen:

aufzeichnen2zxa.png
 
AurionKratos am 13.02.2009 16:33 schrieb:
Du musst deine eigene Klasse schreiben, die du beim sort() übergeben kannst, damit das richtig sortiert wird. Diese Klasse muss den IComparer implementieren.

Hier mal ein Quick´n´Dirty (Noch verbesserungswürdig, vor allem Fehler fangen, wenn es kein DateTime ist, und die Parse-Zeile gefällt mir auch noch nicht wirklich....)

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            dataGridView1.Rows.Add("05.08.2008", "blubb1");
            dataGridView1.Rows.Add("20.12.2059", "blubb2");
            dataGridView1.Rows.Add("14.05.1999", "blubb3");

            dataGridView1.Sort(new Datums_comparer());

        }
    }


    public class Datums_comparer : IComparer
    {
        int IComparer.Compare(Object x, Object y)
        {
            DateTime dt_x = DateTime.Parse(((DataGridViewRow)x).Cells[0].Value.ToString());
            DateTime dt_y = DateTime.Parse(((DataGridViewRow)y).Cells[0].Value.ToString());

            if (dt_x.Ticks < dt_y.Ticks)
            {
                return -1;
            }
            else if (dt_x.Ticks > dt_y.Ticks)
            {
                return 1;
            }
            else
            {
                return 0;
            }

        }

    }

}


Das ist mir ja bekannt...
ich habe das Datum aber im RowHeader !! Nicht in einer normalen Column!
 
Dann musst du einfach
Code:
Cells[0].Value.ToString()
anpassen:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            dataGridView1.RowHeadersWidth = 100;

            dataGridView1.Rows.Add("blubb1", "zweite Spalte");
            dataGridView1.Rows.Add("blubb2", "zweite Spalte");
            dataGridView1.Rows.Add("blubb3", "zweite Spalte");

            dataGridView1.Rows[0].HeaderCell.Value = "05.08.2008";
            dataGridView1.Rows[1].HeaderCell.Value = "20.12.2059";
            dataGridView1.Rows[2].HeaderCell.Value = "14.05.1999";

            dataGridView1.Sort(new Datums_comparer());

        }
    }


    public class Datums_comparer : IComparer
    {
        int IComparer.Compare(Object x, Object y)
        {
            DateTime dt_x = DateTime.Parse(((DataGridViewRow)x).HeaderCell.Value.ToString());
            DateTime dt_y = DateTime.Parse(((DataGridViewRow)y).HeaderCell.Value.ToString());

            if (dt_x.Ticks < dt_y.Ticks)
            {
                return -1;
            }
            else if (dt_x.Ticks > dt_y.Ticks)
            {
                return 1;
            }
            else
            {
                return 0;
            }

        }

    }

}


aufzeichnen0g6i.png
 
also die idee is echt super
nur die Frage wie ich den Comparer einbinde,
wenn ich das so mache wie du dann kommt folgendes:

Code:
DataGridView control is data-bound. The control cannot use the comparer to perform the sort operation.

Das liegt daran das ich mein DGV mit einer DataTable fuelle...
jedoch sind die sortierungsrelevanten daten halt nicht in der DataTable sondern kommen woanders her :) vom Dateiname den ich auslese ....

ps hier mehr infos dazu:
ich lade aus ner datei Zeitstempel
jede datei hat als namen das Datum
somit fuer jede Datei eine Row im DGV .... in der DAtaTable sind dann nur diverse Zeitdaten die ich auswerte....
:) immernoch ne idee ?

aber schonmal danke fuer die antwort
 
So ich habe es geloest !!!!

Ich habe das Array in dem die Files drin stehen, aus denen ich dann auslese, einfach vorher sortiert mit nem primitiven Bubble Sort :)

Dann ist es egal ob die DGV sortiert wird oder nicht ... da die daten schon in der richtigen Reihenfolge kommen.


Ich bedanke mich trotzdem vielmals fuer die Hilfe !!!

und dieses Thema ist damit gegessen!
 
Zurück