ListView in Form-Load-Event

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von xored.

    ListView in Form-Load-Event

    Hey,

    ich habe eine ListView, welche ich erst im Form-Load-Event fülle und danach sortiere:

    VB.NET-Quellcode

    1. SortingType = 1
    2. lvStatistik.ListViewItemSorter = New ListViewKBItemComparer(1, SortOrder.Descending)
    3. lvStatistik.Sort()


    Dies klappt auch.
    Wenn ich aber im Form-Load-Event nach dem Sortieren direkt die Daten auswerten und an ein anderes Control weitergeben möchte, gibt mir der Code eine ganz falsche Reihenfolge aus.
    Ich überprüfe das zusätzlich mit einer Messagebox.

    Den Code rufe ich nach dem Sortieren auf:


    VB.NET-Quellcode

    1. Try
    2. If Not (lbGesamt.Text = "0") Then
    3. Dim R As Integer = 239
    4. Dim G As Integer = 202
    5. Dim B As Integer = 69
    6. For I As Integer = 0 To 5 'Ich will nur die ersten 5 Einträge (Top-Einträge)
    7. Try
    8. If Not (LvStatistik.Items(I).SubItems(0).Text = "") Then
    9. R = R - 3
    10. G = G - 37
    11. B = B - 10
    12. Dim dX As New GBlockChartData
    13. dX.Value = LvStatistik.Items(I).SubItems(1).Text
    14. dX.Name = LvStatistik.Items(I).SubItems(0).Text & " (" & LvStatistik.Items(I).SubItems(1).Text & ")"
    15. dX.FillColor = Color.FromArgb(R, G, B)
    16. GBlockChart1.Data.Add(dX)
    17. End If
    18. Catch
    19. End Try
    20. Next
    21. End If
    22. Catch
    23. End Try


    Warum wird mir also eine falsche Reihenfolge ausgegeben, obwohl ich vorher sortiere?
    Wenn ich einen weiteren Button mache und da den Code ausführe, dann bekomme ich die richtige Reihenfolge ausgespuckt, aber wieso nicht im Form-Load-Event?

    Stehe etwas auf dem Schlauch..
    Jemand nen Tipp?

    Danke :)

    Lg. xored
    Probier mal den Gesamtcode in einem Button zu haben. Ich vermute, dass es dort ebenfalls nicht klappt, weil einfach alles zu straff hintereinander kommt. Es gibt nen Workaround, der meist funktioniert, das eigentlich Problem aber nur umgeht - Workaround eben.

    VB.NET-Quellcode

    1. Private Async Sub DeineVerarbeitungsprozedur
    2. 'hier der ListView-Sortierteil
    3. Await Threading.Tasks.Task.Delay(1)
    4. 'jetzt der restliche Teil mit der Datenübergabe
    5. End Sub

    Alternativ kannst Du es auch ohe Async/Await im Form_Shown-EventHandler testen. Vielleicht liegt es ja tatsächlich am Form_Load

    ach ja: Fange nur Exceptions ab, die Du kennst und sinnvoll bearbeiten kannst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke, das könnte funktionieren, leider werden jetzt die ganzen Statistiken aus Gathers Lib nicht mehr ausgefüllt.
    Diese muss ich leider im Form-Load-Event füllen, weiß nicht warum das zur Laufzeit nicht funktioniert, hat aber dann mit diesem Thema hier nichts zu tun, muss da dann erstmal gucken wie ich
    das behebe..

    Danke trotzdem :)
    Hey, kurze Frage nochmal.

    Da ich immernoch zu keiner Lösung kam, wollte ich es nun anders machen.

    Statt die Charts direkt zu befüllen, wollte ich erst eine SortedList erstellen, diese Sortieren und damit dann die Charts füllen.

    Folgendes benutze ich:

    VB.NET-Quellcode

    1. Dim sorted As SortedList(Of String, String) = New SortedList(Of String, String)
    2. sorted.Add(LvStatistik.Items(I).SubItems(1).Text, LvStatistik.Items(I).SubItems(0).Text)


    Damit fülle ich meine SortedList.

    Diese sortiere ich dann:

    VB.NET-Quellcode

    1. Dim reversed = From p As KeyValuePair(Of String, String) In sorted Order By p.Key Ascending Select p


    Danach gehe ich halt die Werte durch und speise sie in die Charts ein:

    VB.NET-Quellcode

    1. For Each pair In reversed
    2. 'pair.Value & " (" & pair.Key & ")"
    3. Next


    Klappt auch alles mit dem Sortieren, AAABER aus irgendeinem Grund dürfen nicht 2x die gleichen Values in der Liste sein. Sprich es sieht z.B so aus:

    User1:5
    User2:5
    User3:3
    User4:2
    User5:1

    Dann wird einfach User2 gelöscht bzw. nicht mit in die SortedList aufgenommen, was blöd ist.
    Wie behebt man das am besten?
    So ergibt meine TopList keinen Sinn, wenn leute mit den gleichen Scores quasi nicht aufgelistet werden, bzw. nur einer davon..

    xored schrieb:

    aus irgendeinem Grund dürfen nicht 2x die gleichen Values in der Liste sein
    Gleiche Values dürfen sehr wohl drin sein, nur nicht gleiche Keys.
    Du wirst wahrscheinlich beim Befüllen die beiden verwechseln.

    Ausserdem verstehe ich nicht, warum du die Liste nochmals sortieren willst.
    Sie ist automatisch nach dem Key sortiert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Gleiche Values dürfen sehr wohl drin sein, nur nicht gleiche Keys.
    ja, aber die SortedList will er ja nach Score sortiert haben, nicht nach User.
    Und wenn zwei user denselben Score erreichen, kann nur einer in der SortedList sein, Oder?
    weiss ich nicht, ich kenne das VErhalten von SortedList nicht. Wäre es ein Dictionary, gäbe es eine Exception, wenn man einen Score erneut adden will.
    Vielleicht muss man sich eine kleine Datensatz-Klasse basteln, UserScore oder sowas, und dann eine stinknormale List(Of UserScore) nehmen und sortieren.