Datagridview sortieren (Numerisch)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datagridview sortieren (Numerisch)

    Hallo zusammen,

    ich hoffe ich bin in diesem Unterforum mit meiner Frage richtig.

    Ich möchte ein Datagridview sortieren lassen, sodass die Werte absteigend angezeigt werden.

    Jede Zeile hat eine Nummer die jedoch nicht der ID in der Datenbank enspricht. Diese ist meistens vierstellig und ausschließlich numerisch.

    Ich habe es probiert mit:

    VB.NET-Quellcode

    1. DGVjobs.Sort(DGVjobs.Columns(0), System.ComponentModel.ListSortDirection.Descending)


    Dies zeigt jedoch keinerlei Veränderung. Diese Codezeile habe ich in die Codezeile des Loadevents gepackt. (Im Spoiler)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub FrmDispo_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Try
    3. DTS1.Clear()
    4. DTS1.ReadXml(_dataFile.FullName)
    5. Catch ex As Exception
    6. Exit Sub
    7. MsgBox(ex)
    8. End Try
    9. DGVjobs.Sort(DGVjobs.Columns(0), ListSortDirection.Descending)
    10. Dim lastjobnumber As Integer = DGVjobs.CurrentCell.Value.ToString
    11. End Sub


    Ich denke, dass es eine sehr einfache Lösung gibt. Die Artikel bei MSDN haben mir auch nicht wirklich weitergeholfen...

    Vielen Dank für eure Antworten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Moritz Jökel“ ()

    Was meinst Du mit "zeigt jedoch keinerlei Veränderung"? Daten bleiben un- oder falsch sortiert?
    Kann es sein, das Du zwar einen Numerischen Wert hast, den aber aus einer Datenbank holst dessen Feldtyp z.B. "char" ist?
    Dann wird dir in die DGV auch ein Text also "1234567" eingetragen und der dann auch als "Text" sortiert.

    Moritz Jökel schrieb:

    Loadevent
    Gib mal die MessageBox vor dem Exit Sub aus.
    Dann machst Du einen Haltepunkt rein, steppst die Prozedur durch und siehst Dir den Inhalt der Variablen an. Gugst Du hier.
    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!

    FerroKarr schrieb:

    Was meinst Du mit "zeigt jedoch keinerlei Veränderung


    Hallo,
    Die Daten bleiben aufsteigend sortiert. Die Column im Dataset, welches im übrigen mit einer Bindingsource an das DGV angebunden ist, ist Typ Int32. Da liegt also nicht das Problem.

    ​Gib mal die MessageBox vor dem Exit Sub aus.

    Dies ist hier nicht das Problem, das Laden des Datasets funktioniert einwandfrei. Ich habe den Code nur zum besseren Verständnis (?) in den Spoiler dazu gepackt...
    Schmeiß mal den alten Code weg und mach mal ein richtiges Datenmodell draus. Wenn du die Daten als XML persistieren willst, dann bau dir eine Klasse, welche die Daten als Liste von Objekten trägt, serialisier die und fertig. Beim wieder einlesen machst du aus der XML-Datei per XmlSerializer wieder dein Objekt mit der Liste von Objekten (welche die Daten enthalten). Dann kannst du über DateBinding deine Daten an das DataGridView binden.
    Vorteil hierbei: Du brauchst nicht mehr über DataGridView.Sort arbeiten (was nebenher dämlich ist, da Controls nur zur Anzeige dienen sollten - hier schießt sich MSDN meiner Meinung nach ins eigene Knie), sondern kannst die zugrundeliegende Collection von Daten über LINQ sortieren und wieder ausgeben.

    Hier mal ein Bsp Code, der auch funzt ;D

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.IO
    4. Imports System.Linq
    5. Imports System.Xml.Serialization
    6. Public Class Form1
    7. ' In deinem LoadEvent oder wo auch immer aufrufen
    8. Public Sub LoadDataToDataGridView(pfad As String)
    9. Dim xmlSerializer As New XmlSerializer(GetType(RootElement))
    10. Dim o As RootElement
    11. Using fs As FileStream = New FileStream(pfad, FileMode.Open, FileAccess.Read, FileShare.Read)
    12. o = DirectCast(xmlSerializer.Deserialize(fs), RootElement)
    13. End Using
    14. If (o IsNot Nothing) Then
    15. o.MyObjects = o.MyObjects.AsEnumerable().OrderByDescending(Function(x) x.Name).ToList()
    16. Me.DataGridView1.DataSource = o.MyObjects
    17. End If
    18. End Sub
    19. Private Sub btnSave_Click(sender As Object, e As System.EventArgs) Handles btnSave.Click
    20. Dim ro = New RootElement()
    21. ro.MyObjects = New List(Of MyObject)()
    22. ro.MyObjects.Add(New MyObject() With
    23. {
    24. .Id = 1,
    25. .Name = "Test1"
    26. })
    27. ro.MyObjects.Add(New MyObject() With
    28. {
    29. .Id = 2,
    30. .Name = "Test2"
    31. })
    32. ro.MyObjects.Add(New MyObject() With
    33. {
    34. .Id = 3,
    35. .Name = "Test3"
    36. })
    37. ro.MyObjects.Add(New MyObject() With
    38. {
    39. .Id = 4,
    40. .Name = "Test4"
    41. })
    42. Dim xmlSerializer = New XmlSerializer(GetType(RootElement))
    43. Using fs As New FileStream("daten.xml", FileMode.CreateNew, FileAccess.Write, FileShare.Write)
    44. xmlSerializer.Serialize(fs, ro)
    45. End Using
    46. End Sub
    47. Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click
    48. Me.LoadDataToDataGridView("daten.xml")
    49. End Sub
    50. End Class
    51. Public Class MyObject ' Die Klasse, welche jede Zeile repräsentiert
    52. Public Property Id As Integer
    53. Public Property Name As String
    54. ' ...
    55. End Class
    56. Public Class RootElement
    57. Public Property MyObjects As List(Of MyObject)
    58. End Class


    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Moritz Jökel schrieb:

    Dies zeigt jedoch keinerlei Veränderung.
    Das ist oft ein Trugschluss, wenn die Zeile im Startup ausgeführt wird.
    Was tatsächlich passiert ist, dass eine Exception geworfen wird, aber leider zeigt der Debugger den Fehler nicht an - imo der größte Bug, den MS je eingebaut hat ins VS.
    Setz mal einen Haltepunkt auf die Zeile mit dem DGV.Sort(,), und steppe im Einzelschritt weiter - wenn meine Vermutung stimmt, dann sollte die Methode dort überraschend abbrechen, und das Programm setzt ganz woanners fort.