Datum sortieren Datagridview

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Datum sortieren Datagridview

    Hallo

    Ich habe eine DGV was über eine XML Datei gefüllt wird.
    Jetzt möchte ich in diesem DGV die Spalte Geburtstag sortieren.
    Das Datum steht so (<Geburtsdatum>1983-07-12T00:00:00+02:00</Geburtsdatum>) in der XML.
    Wenn ich jetzt die Spalte durch anklicken sortieren will, wird das Datum nur nach dem Jahr sortiert, und nicht nach Tag und Monat.
    Kann mir hier bitte jemand Helfen oder hat einen Tipp für mich.
    Danke
    Gruß Bitti
    Dann musst Du Dir einen eigenen Sorter schreiben, der nach Monat und Tag, nicht aber nach dem Datum selbst sortiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    oder du liest das Zeug in ein typisiertes Dataset ein, bei dem die Datum-Spalte vom Typ Date ist.
    Dann kann ein an die Tabelle gebundenes DGV das selbst richtig sortieren.

    Dataset kann auch Xml schreiben und lesen, aber lesen ist natürlich zuverlässig nur, wenns vom selben Dataset auch geschrieben wurde. Gugge Daten laden, speichern, verarbeiten
    Hi

    Ich habe das mit einem Dataset gemacht, es wird aber nur nach dem Jahr richtig sortiert.
    Ich hab mal 2 Screens angehängt.
    1x Von meinem DGV
    1x Von deinem Testprojekt

    Die sortierung sollte ja nach Monat, Tag und Jahr erfolgen
    Bilder
    • sortierung.PNG

      4,11 kB, 226×175, 1.096 mal angesehen
    • sortierung2.PNG

      18,41 kB, 324×205, 173 mal angesehen
    Gruß Bitti
    also ich sehe da die Richtige sortierung.
    Erst nach Jahre dann nach Monate und dann nach Tage.

    Mach doch mal das gleiche Jahr und den gleichen Monat.
    Nur den Tag unterschiedlich.

    Dann sortierst du nochmal.


    sorry falsch gelesen.

    Bernd

    Bitti schrieb:

    Die sortierung sollte ja nach Monat, Tag und Jahr erfolgen

    was für eine komische Sortierung. Normalerweise sortiert man nach Jahr, Monat, Tag, Stunde, Minute, Sekunde. Oder kurz gesagt: entweder das neueste Datum nach vorn, oder nach hinten.

    Bei Monat, Tag, Jahr würde ja der 11.9.2001 als "später" einsortiert als der 4.5.2012.

    RodFromGermany schrieb:

    Dann musst Du Dir einen eigenen Sorter schreiben, der nach Monat und Tag, nicht aber nach dem Datum selbst sortiert.

    Probier mal dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub DataGridView2_ColumnHeaderMouseClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView2.ColumnHeaderMouseClick
    3. If e.ColumnIndex = 1 Then
    4. DataGridView2.Sort(New DgvComparerDate(1))
    5. End If
    6. End Sub
    7. End Class
    8. Class DgvComparerDate
    9. Implements IComparer
    10. Private _col As Integer
    11. Public Sub New()
    12. _col = 0
    13. End Sub
    14. Public Sub New(ByVal column As Integer)
    15. _col = column
    16. End Sub
    17. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    18. Dim Row1 As DataGridViewRow = CType(x, DataGridViewRow)
    19. Dim Row2 As DataGridViewRow = CType(y, DataGridViewRow)
    20. ' compare number in 1. Column
    21. Dim tt1 As String = Row1.Cells(_col).Value.ToString
    22. Dim tt2 As String = Row2.Cells(_col).Value.ToString
    23. Dim Date1 As DateTime = DateTime.Parse(tt1)
    24. Dim Date2 As DateTime = DateTime.Parse(tt2)
    25. Dim Date11 = New DateTime(2011, Date1.Month, Date1.Day)
    26. Dim Date22 = New DateTime(2011, Date2.Month, Date2.Day)
    27. Return Date11.CompareTo(Date22)
    28. End Function
    29. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi RodFromGermany

    Hab deinen Code angepaßt und probiert, funktioniert aber leider nicht.

    Fehlermeldung:

    Spoiler anzeigen
    System.InvalidOperationException wurde nicht behandelt.

    Message=Das DataGridView-Steuerelement ist datengebunden. Das
    Steuerelement kann nicht den Vergleich für den Sortiervorgang verwenden.

    Source=System.Windows.Forms

    StackTrace:

    bei System.Windows.Forms.DataGridView.Sort(IComparer comparer)

    bei
    Mitgliederverwaltung.frmMitglieder.MitgliederDataGridViewGeburtstag_ColumnHeaderMouseClick(Object
    sender, DataGridViewCellMouseEventArgs e) in
    C:\Users\Bitti\documents\visual studio
    2010\Projects\Mitgliederverwaltung\Mitgliederverwaltung\frmMitglieder.vb:Zeile
    64.

    bei System.Windows.Forms.DataGridView.OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e)

    bei System.Windows.Forms.DataGridView.OnMouseClick(MouseEventArgs e)

    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

    bei System.Windows.Forms.Control.WndProc(Message& m)

    bei System.Windows.Forms.DataGridView.WndProc(Message& m)

    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)

    bei
    System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr
    dwComponentID, Int32 reason, Int32 pvLoopData)

    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)

    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)

    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()

    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()

    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)

    bei Mitgliederverwaltung.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.

    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

    bei System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)

    bei System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)

    bei System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()

    bei
    System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext
    activationContext, String[] activationCustomData)

    bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)

    bei System.Activator.CreateInstance(ActivationContext activationContext)

    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()

    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)

    bei System.Threading.ExecutionContext.Run(ExecutionContext
    executionContext, ContextCallback callback, Object state, Boolean
    ignoreSyncCtx)

    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

    bei System.Threading.ThreadHelper.ThreadStart()

    InnerException:

    Gruß Bitti

    Bitti schrieb:

    funktioniert aber leider nicht.
    ...
    Message=Das DataGridView-Steuerelement ist datengebunden. Das
    Steuerelement kann nicht den Vergleich für den Sortiervorgang verwenden.

    Dann solltest Du für diesen Snippet die Datenbindung aufheben.
    Neues Projekt, DGV, meinen Code und weiter nichts.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!