vb.net, Daten aus Structure Array mit "Filter" auslesen

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

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

    vb.net, Daten aus Structure Array mit "Filter" auslesen

    Hallo,

    ich versuche aus einem structure-array die Zeilen zu bekommen die auf bestimmte Kriterien zutreffen.
    Als Filter dienen 4 checkedListBoxen mit verschiedenen Werten.(Jede Spalte stellt eine clb da)
    typepaidcategoryaccount
    Ausgabe (0)Bezahlt (1)11
    Einnahme (1)Ausstehend (0)22


    33

    Mein strcuture-array sieht so aus:

    VB.NET-Quellcode

    1. Public Structure transaction
    2. Public id As Integer
    3. Public transaction_date As String
    4. Public value As Double
    5. Public category As Integer
    6. Public charge_account As Integer
    7. Public to_account As Integer
    8. Public type As Integer
    9. Public paid As Integer
    10. Public description As String
    11. End Structure


    Wenn z.B.
    type: Ausgabe
    paid: Bezahlt, Ausstehend
    category: 1
    account: 1
    "gecheckt" ist. Dann möchte ich nur die Zeile aus dem Array haben die darauf zutrifft.

    Versucht habe ich es bereits so:

    VB.NET-Quellcode

    1. Dim matchingType(0) As transaction
    2. Dim countMatchingType As Integer = 0
    3. If (clbType.SelectedIndices.Count >= 1) Then
    4. For Each item In clbType.SelectedIndices
    5. If (Integer.Parse(item.ToString) = 0) Then
    6. Dim ia As Integer = 0
    7. countMatchingType = 0
    8. Do
    9. If (allTransactions(ia).type = 0) Then
    10. countMatchingType += 1
    11. End If
    12. ia += 1
    13. Loop Until ia = countTransactions
    14. ReDim matchingType(countMatchingType)
    15. ia = 0
    16. Dim index As Integer = 0
    17. Do
    18. If (allTransactions(ia).type = 0) Then
    19. matchingType(index) = allTransactions(ia)
    20. index += 1
    21. End If
    22. ia += 1
    23. Loop Until ia = countTransactions
    24. End If
    25. Next
    26. End If


    Gibt es eine leichtere Möglichkeit um so einen Filter zu realisieren?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Leon3011“ ()

    Willkommen im Forum.

    Leon3011 schrieb:

    item.ToString = 0
    :?:

    Leon3011 schrieb:

    MsgBox
    :?:
    Bitte erstmal die empfohlenen Einstellungen beachten (Option Strict On, ohne VB6-Namespace), dann geht's weiter.

    Leon3011 schrieb:

    Wenn z.B.
    type: Ausgabe
    paid: Bezahlt, Ausstehend
    category: 1
    account: 1
    "gecheckt" ist. Dann möchte ihr nur die Zeile aus dem Array haben die darauf zutrifft.

    Wie kann eine einzige Zeile bezahlt und ausstehend zugleich sein? Entweder hab ich zuwenig Phantasie oder hier liegt ein Fehler vor. Wären da nicht RadioButtons sinnvoller? Oder wie stellst Du sicher, dass nicht mehrere, sich ausschließende Optionen ausgewählt wurden?
    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.
    Danke!

    Hoffe so ist es richtig (?)
    Strict on/off kannte ich gar nicht, gut zu wissen.

    Es soll nicht beides auf eine Zeile zutreffen sondern nur eines von beiden.
    Also wenn man 2 Zeilen hat, eine bezahlt, die andere ausstehend und beides ausgewählt ist dann sollen diese beiden angezeigt werden. :)






    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Leon3011“ ()

    Ich würde es eher folgendermaßen machen*:
    Du gehst alle Einträge Deiner Rechnungsliste durch und merkst Dir z.B. in einer (weiteren?) List(Of transaction) alle Transaktionen, die die Kriterien erfüllen. Danach lässt Du jene in Deinem Ziel-CE anzeigen.
    Als Pseudocode:

    Quellcode

    1. Schleife über alle Transaktionen (i)
    2. Schleife über alle CLBs (j)
    3. Wenn die Transaktion i die gewählten Bedingung der CLB j erfüllt, dann merke Dir diese Transaktion
    4. Schleifenende
    5. Schleifenende


    Als etwas konkreteres Beispiel:

    VB.NET-Quellcode

    1. Dim ListOfTransactions As New List(Of transaction)
    2. For Each Transaction In ListOfAllTransactions
    3. If ClbCategory.CheckedItems.Cast(Of String).ToArray.Contains(Transaction.category.ToString) Then ListOfTransactions.Add(Transaction): Continue For
    4. If ClbAccount.CheckedItems.Cast(Of String).ToArray.Contains(Transaction.to_account.ToString) Then ListOfTransactions.Add(Transaction): Continue For
    5. '...
    6. Next


    btw: Du verwendest ne Structure? Inkl. ID-Variable? Es fehlt nicht mehr viel und Du bist bei tDS und Co.

    *um genau zu sein: So mache ich es bei meinem privaten Kassenbuch
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo @Leon3011!

    Leon3011 schrieb:

    Gibt es eine leichtere Möglichkeit um so einen Filter zu realisieren?
    Mir fällt da spontan die Möglichkeit "LINQ und If bzw. Select Case" ein.

    Dazu das das Struct Array zu einer List(Of T) bzw einem IEnumerable(Of T) über die Erweiterungsmethode .ToList() konvertieren. Auf die (konvertierte) Liste kannst Du dann ein .Where(Function (x) ... )

    VB.NET-Quellcode

    1. Dim transactions = transactionArray _
    2. .ToList() _
    3. .Select(Function(x)
    4. If x.paid = 1 Then
    5. ' Weitere Abfragen
    6. Return x
    7. End If
    8. Return Nothing
    9. End Function)


    Oder Du baust dir eine Function, die ein Objekt vom Typen Struct Transaction nimmt und entweder null oder das Objekt wieder liefert (ist zwar im Endeffekt das selbe wie oben, nur mit zusätzlichem Code)
    Hat halt am Ende den Charme, dass Du nicht mit For Loops und zusätzlichen Index Variablen arbeiten musst, sondern gleich eine List(Of T) bzw wenn du ToArray() machst, wieder ein Array liefert.

    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