ListOf( Eigene Klasse ) nach unterschiedlichen Propertys sortieren

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    ListOf( Eigene Klasse ) nach unterschiedlichen Propertys sortieren

    Ich habe eine eigene Klasse

    VB.NET-Quellcode

    1. Public Class clsArticle
    2. Public Property ArtNr As String
    3. Public Property Name As String
    4. End Class


    und eine

    VB.NET-Quellcode

    1. LstArticles As New List(Of clsArticle)


    Könnt Ihr mir sagen, wie ich die Liste nach der Property Name aufsteigend/absteigend sortieren kann?

    Ich hab jetzt schon ne Weile gesucht und mit IComparable probiert aber irgendwie stehe ich auf dem Schlauch.

    VB.NET-Quellcode

    1. Dim OrderedList = LstArticles.OrderBy(Function(x) x.Name).ToList

    Das wäre aufsteigend. Absteigend: Da gibt's was ähnliches wie OrderBy. Find's mal selbst raus. ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Prima, rausgefunden, danke.

    Das ganze soll jetzt noch beim Klick auf einen Spaltenkopf in einem Datagridview passieren, d.h. ich muß das "x.Name" in

    VB.NET-Quellcode

    1. Dim OrderedList = LstArticles.OrderBy(Function(x) x.Name).ToList


    per Variable setzen können. Geht das oder muß ich für jede Spalte meiner Tabelle hard coden?
    naja, du musst nu iwas dolles ans DGV drancoden, dass da eine Sortierung ausgelöst wird, wenn du auf einen SpaltenHeader klickst.
    Jo, und für jede Spalte musst du Code aufsetzen - es sei denn, du bastelst was dolles mit Reflection.

    Ich rate eher ab von selbstgebastelten Datenklassen, und empfehle immer typisiertes Dataset, mit seinen generierten Datenklassen - da kriegst du Sortieren auf und ab bei DGV-HeaderClick geschenkt - ohne eine Codezeile.
    Auch Filtern kriegst du weitestgehend geschenkt - eine Codezeile (den Filter muss man ja setzen).
    Und alles mögliche andere, was man für eine Datenverarbeitung braucht, kriegt man auch geschenkt.
    Hab bei CodeProject was gefunden. Hab's mal nach VB.NET übersetzt. Wenn Du diese Klasse als Datenhaltung verwendest, geht's, siehe Beispiel.
    SortableBindingList

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class SortableBindingList(Of T) : Inherits BindingList(Of T)
    3. Private IsSorted As Boolean
    4. Private SortDirection As ListSortDirection
    5. Private SortProperty As PropertyDescriptor
    6. Public Sub New(Enumerable As IEnumerable(Of T))
    7. MyBase.New(Enumerable.ToList())
    8. End Sub
    9. Public Sub New()
    10. End Sub
    11. Protected Overrides ReadOnly Property SupportsSortingCore As Boolean
    12. Get
    13. Return True
    14. End Get
    15. End Property
    16. Protected Overrides ReadOnly Property IsSortedCore As Boolean
    17. Get
    18. Return IsSorted
    19. End Get
    20. End Property
    21. Protected Overrides ReadOnly Property SortDirectionCore As ListSortDirection
    22. Get
    23. Return SortDirection
    24. End Get
    25. End Property
    26. Protected Overrides ReadOnly Property SortPropertyCore As PropertyDescriptor
    27. Get
    28. Return SortProperty
    29. End Get
    30. End Property
    31. Protected Overrides Sub ApplySortCore(PropertyDescriptor As PropertyDescriptor, Direction As ListSortDirection)
    32. IsSorted = True
    33. SortDirection = Direction
    34. SortProperty = PropertyDescriptor
    35. Dim Predicate As Func(Of T, Object) = Function(x) x.GetType().GetProperty(PropertyDescriptor.Name).GetValue(x, Nothing)
    36. ResetItems(If(SortDirection = ListSortDirection.Ascending, Items.AsParallel().OrderBy(Predicate), Items.AsParallel().OrderByDescending(Predicate)))
    37. End Sub
    38. Protected Overrides Sub RemoveSortCore()
    39. IsSorted = False
    40. SortDirection = MyBase.SortDirectionCore
    41. SortProperty = MyBase.SortPropertyCore
    42. ResetBindings()
    43. End Sub
    44. Private Sub ResetItems(Items As IEnumerable(Of T))
    45. RaiseListChangedEvents = False
    46. Dim TempList = Items.ToList()
    47. ClearItems()
    48. TempList.ForEach(Sub(x) Add(x))
    49. RaiseListChangedEvents = True
    50. ResetBindings()
    51. End Sub
    52. Public Function Load(Enumeration As IEnumerable(Of T)) As SortableBindingList(Of T)
    53. ResetItems(Enumeration)
    54. Return Me
    55. End Function
    56. End Class

    Beispiel:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ReadOnly Cars As New SortableBindingList(Of Car)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Cars.Add(New Car With {.Name = "Dummler Brenz"})
    5. Cars.Add(New Car With {.Name = "Audio"})
    6. DataGridView1.DataSource = Cars
    7. End Sub
    8. End Class
    9. Public Class Car
    10. Property Name As String
    11. End Class

    Starten, ColumnHeader klicken, ist sortiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.