Listboxen - letze zwei Werte checken!

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Listboxen - letze zwei Werte checken!

    Moin! :)
    Ich habe eine komplizierte Aufgabe und erbitte um Hilfe.
    Nun die Problembeschreibung:
    Ich habe eine Listbox1 diese wird mit verschiedenen Werten gefüllt.
    Zum Beispiel 1 bis 15.
    (1,2,3,4 und so weiter….)
    Wenn nun der letzte und vorletzte Wert gleich ist.
    Also beides 15 – 15.
    Dann soll etwas passieren.
    Freue mich auf eure Hilfe.

    BIG THX



    VB.NET-Quellcode

    1. If VorletzerUndLetzerWertGleich then
    2. Me.Button1.Enablen = True
    3. End if
    Visual Basic.NET 8o
    MS-SQL
    8o
    Der einfachste Weg, den ich wüsste, wäre

    1. ListBox.Count um die Anzahl zu ermitteln und dann hast du die Gesamtwerte und könntest sie ansprechen
    oder noch einfacher
    2. ListBox.Item(ListBox.Count) IS ListBox.Item(ListBox.Count -1) vergleichen

    Ist es das was du suchst?

    Aber wenn du die ListBox befüllst - wie kann dann der letzte Wert gleich dem vorletzten Wert sein?
    Nee, mit Is geht's nicht, weil Is ein Objektinstanzvergleich ist. Da das zwei unterschiedliche Items sind (auch wenn der dargestellt Wert gleich ist), schlägt das fehl. Desweiteren sind Listenindizes (wie auch bei Arrays) 0-basiert -> es müssen ListBox.Item(ListBox.Count - 1) und ListBox.Item(ListBox.Count - 2) verglichen werden. Man könnte noch mit .ToString den Text-Wertvergleich machen. Aber wie korrekt erwähnt wurde: Du befüllst die ListBox. Aber wenn Du natürlich alle Items nicht in einem Zug da reinsteckst, musst Du vergleichen. Aber: Nicht die ListBox sollte hergenommen werden, sondern die Liste, die die Werte aufbewahrt. Oder willst Du sagen, dass die Werte nur in der Listbox gesammelt werden?
    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.
    Oha, stimmt @VaporiZed - das hab ich missachtet. Klar muss natürlich -1 und -2 sein, bei 15 Einträgen ist der letzte Eintrag ja Nummer 14 weil der erste Eintrag Nummer 0 ist. (ups) :whistling:
    Das mit dem IS Vergleich hätte ich jetzt so nicht gedacht aber gut zu wissen - hatte es nicht ausprobiert - war eher Steil aus der Hüfte geschossen.

    Cheffboss schrieb:

    Wenn nun der letzte und vorletzte Wert gleich ist
    Was sind das für Einträge? Wie definiert sich Gleich?
    Betrifft es nur die letzten beiden Einträge oder sonst irgend zwei?
    Da müsstest Du die Einträge sortieren und immer zwei aufeinanderfolgende auf Gleichheit prüfen.
    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!
    @an alle
    Danke, für eure Antworten. :)
    Meine Problemlösung ist doch etwas anders als ich gestern gedacht habe.
    Die Werte in der Listbox1 steigen hoch 1 2 3 4 5….
    Und irgendwann, am höchsten Wert, zeigt es nur noch 15 15 15 15.
    Also wenn der Letze Wert mehrmals den gleichen Wert hat.
    Soll das Programm etwas tun!
    Ich habe folgenden Code programmiert:
    (bitte nicht lachen).

    VB.NET-Quellcode

    1. If Me.ListBox1.Items.Count = -1 Then Exit Sub
    2. If Me.ListBox1.Items.Count = 0 Then Exit Sub
    3. Try
    4. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 1) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 3) Then
    5. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 2) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 4) Then
    6. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 3) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 5) Then
    7. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 4) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 6) Then
    8. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 5) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 7) Then
    9. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 6) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 8) Then
    10. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 7) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 9) Then
    11. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 8) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 10) Then
    12. If Me.ListBox1.Items(Me.ListBox1.Items.Count - 9) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 11) Then
    13. ' Hier weiter machen....
    14. Me.Button1.Enabled = True
    15. Me.Timer1.Enabled = False
    16. End If
    17. End If
    18. End If
    19. End If
    20. End If
    21. End If
    22. End If
    23. End If
    24. End If
    25. Catch
    26. End Try


    Wäre cool wenn man diesen Code optimieren kann, da dieser sehr blöd aussieht.
    Und bestimmt viel einfacher und kurzer sein kann. :!:
    Freue mich auf Antworten.

    edit2:
    @RodFromGermany
    Mit gleich meine ich wenn ein Listbox1 Item die 15 als Zahl hat, und der andere Wert auch.

    @ErfinderDesRades
    Im meinen Fall muss ich mit einer Listbox1 arbeiten.
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    @Cheffboss Ohne das jetzt genau zu verfolgen:

    VB.NET-Quellcode

    1. If Me.ListBox1.Items.Count = -1 Then Exit Sub
    Dieser Fall kann nicht vorkommen, die Anzahl ist stets >= 0.
    Wenn Du rückwärts rangehst, sollte das wesentlich kürzer werden.
    Und:
    Wie kommen denn die Items in die ListBox?
    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!
    Post#7, Zeile#3: Fange nur Exceptions ab, die Du kennst und sinnvoll bearbeiten kannst.
    Z#4: If Me.ListBox1.Items(Me.ListBox1.Items.Count - 1) = Me.ListBox1.Items(Me.ListBox1.Items.Count - 3): Wieso denn jetzt - 1 und - 3?
    Probier doch mal, wie gut Du selbst die ganzen Ifs durch eine einzige For-Schleife ersetzen kannst.
    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.
    Ich würde sagen der Fehler liegt hier etwas verschoben.

    Du fragst nach einem Fehler um ihn zu beseitigen aber erst nach dem du ihn begangen hast - bzgl. deiner WENN - DANN Abfragen.
    Richtiger wäre es ja den Fehler gar nicht erst zu machen. Also während du die ListBox befüllst schon abfragen ob es einen solchen Fehler geben wird dann abbrechen/umgehen oder ähnliches.

    Du solltest also mal zeigen wie du die ListBox befüllst. Denn dort geschieht ja der Fehler. Also im .ADD Vorgang bereits. Somit musst du bereits dort den Fehler suchen und nicht erst später nachdem es zu spät ist.
    So fülle ich die Listbox1:

    VB.NET-Quellcode

    1. Public TotalPages As Integer = 0
    2. Public Anzahl As Integer = 0
    3. Private Function DruckerAnzahlSeitenAuslesen() As Integer
    4. ' Druckerauftrag Seitenzahlen auslesen...
    5. Do
    6. If TotalPages <= Anzahl Then Exit Do
    7. Me.ListBox1.Items.Add(TotalPages) ' Seiten: z.B 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
    8. Anzahl = TotalPages
    9. Loop
    10. Return Anzahl
    11. End Function

    Ich möchte wenn die letze Seite angezeigt wird, im meinen Beispiel ist es die Seite 15.
    Dann soll ein Button Enabeld werden.
    Die letze Seite ist beliebig, es können auch mehre Seiten oder weniger sein! :!:
    Visual Basic.NET 8o
    MS-SQL
    8o
    Die Do-Schleife ist so gezeigt Hunz. Anzahl wird in Zeile#8 auf den Wert von TotalPages gesetzt, wodurch beim nächsten Durchlauf die Do-Schleife abgebrochen wird. Dann kann man die Do-Schleife auch gleich sein lassen.
    Was für'n Button soll enabled werden? Da ist doch gar kein Button im gezeigten Code.
    In Zeile#7 muss dann einfach geschaut werden, welcher der letzte Eintrag der ListBox ist und dem Wert mit TotalPages verglichen werden. Wenn die gleich sind, dann Ende Gelände. Aber der ganze Code ergibt mit den hiesigen Daten überhaupt keinen Sinn.

    btw: einmal hätte ich an einen Tippfehler gedacht, aber: es wird »letzte« geschrieben, also 2x T (aber nicht Doppel-T)
    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.
    @Cheffboss Was ist denn ühaupt Dein Plan?
    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!
    @RodFromGermany
    Mein Plan ist es, dass die Anzahl der Seiten ausgelesen werden.
    Und wenn alle Seiten ausgelesen bzw. gedruckt worden sind.
    Dann möchte ich den Button Enabled um den Druckauftrag zu bestätigen.
    Bis jetzt habe ich es geschaft das alle Seiten in die Listbox eingetragen werden.

    (Siehe Bild)
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Wo kommt denn die Information der gerade gedruckten Seite her?
    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!
    @an alle
    Vielen Dank, für eure Hilfe. :)
    Ich habe nun das Problem lösen können.
    Einfach den Status überprüfen.
    Und dann den Button Enabeln.

    edit2:
    Die Lösung:

    VB.NET-Quellcode

    1. Public TotalPages As Integer = 0
    2. Public Anzahl As Integer = 0
    3. Public jobStatus As String = ""
    4. Private Function DruckerAnzahlSeitenAuslesen() As Integer
    5. ' Druckerauftrag Seitenzahlen auslesen...
    6. Do
    7. If TotalPages <= Anzahl Then Exit Do
    8. Anzahl = TotalPages
    9. Loop
    10. Return Anzahl
    11. End Function
    12. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    13. Dim prntJob As New ManagementObject
    14. ' read print job data (print settings e.g. color, pages, etc.)
    15. Dim searchQuery As String = "SELECT * FROM Win32_PrintJob"
    16. Dim searchPrintJobs As ManagementObjectSearcher = New ManagementObjectSearcher(searchQuery)
    17. Dim printJobCollection As ManagementObjectCollection = searchPrintJobs.Get()
    18. ' iterate all print jobs
    19. For Each job As ManagementObject In printJobCollection
    20. For Each prntJob In printJobCollection
    21. If prntJob.Properties("JobId").Value.ToString() = job.Properties("JobId").Value.ToString() Then
    22. TotalPages = Integer.Parse(prntJob.Properties("TotalPages").Value.ToString())
    23. jobStatus = prntJob.Properties("StatusMask").Value.ToString()
    24. Exit For
    25. End If
    26. Next
    27. Next
    28. If jobStatus = "1" Then
    29. Me.btn_yes.Enabled = True
    30. Else
    31. Me.Text = "Bitte warten..."
    32. End If
    33. End Sub

    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Cheffboss“ ()

    @Cheffboss Das wird ja immer diffuser.
    Warum heißt Button1 Button1? btn_yes hat einen sinnvollen Namen.
    Was macht Timer2? Werden die Button iwann disabled?
    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!
    @RodFromGermany
    Das mit den Button Namen werde ich im meinen Programm noch anpassen.
    Das soll nur ein Beispielsein das die anderen User die auch das gleiche Problem haben.
    Die Lösung nachvolziehen könnnen.
    (Habe den Code noch etwas verbessert...)
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Cheffboss schrieb:

    Das soll nur ein Beispielsein das die anderen User die auch das gleiche Problem haben.
    Da sollte der Code aber auch gut dokumentiert sein und auch das Problem, das er löst, muss verständlich dargelegt werden.
    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!