[VB] ListBox.SelectedIndex hochzählen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von MS95.

    [VB] ListBox.SelectedIndex hochzählen

    Hallo Leute,
    ich bin neu hier und stelle mal direkt meine Frage :)
    Ich wollte ein kleines Programm erstellen und nun habe ich folgendes Problem:

    Es gibt einen Button "AusgewaehlteDatenEntfernen" und 3 Listboxen "ListBoxEinnahmen", "ListBoxBezeichnung" und "ListBoxKommtAm" (Ja, die Namen sind evtl. nicht so optimal, aber egal...)

    Nun habe ich schon mit folgendem Code erreicht, dass wenn ich in der ListBoxEinnahmen einen Index auswähle, der gleiche Index auch in den beiden anderen Listboxen ausgewählt wird:

    VB.NET-Quellcode

    1. Private Sub ListBoxEinnahmen_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBoxEinnahmen.SelectedIndexChanged
    2. ListBoxBezeichnung1.SelectedIndex = ListBoxEinnahmen.SelectedIndex
    3. ListBoxKommtAm.SelectedIndex = ListBoxEinnahmen.SelectedIndex
    4. End Sub


    Jetzt will ich mit einem Click auf den Button "AusgewaehlteDatenEntfernen" erreichen, dass der gleiche Index in allen 3 Listboxen gelöscht wird. Bisher habe ich dazu folgenden Code:

    VB.NET-Quellcode

    1. Private Sub ButtonAusgewaehlteFelderLeeren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAusgewaehlteDatenEntfernen.Click
    2. ListBoxEinnahmen.Items.RemoveAt(ListBoxEinnahmen.SelectedIndex)
    3. ListBoxBezeichnung1.Items.RemoveAt(ListBoxEinnahmen.SelectedIndex)
    4. ListBoxKommtAm.Items.RemoveAt(ListBoxEinnahmen.SelectedIndex)
    5. End Sub


    Hier ist das Problem aber, dass der Eintrag in ListBoxEinnahmen gelöscht wird, aber die anderen beiden jedoch nicht - und das Programm stürzt ab.
    Was der Fehler ist weiß ich glaube ich schon:
    Zuerst wird der Index von ListBoxEinnahmen gelöscht und erst im Anschluss die anderen beiden; Da sich jedoch der Index auf die ListBoxEinnahmen (inzwischen schon gelöscht) bezieht, kann der Index "-1" in den beiden anderen Listboxen nicht gefunden werden... Aber wie kann ich es nun machen, dass die anderen beiden Listboxen auch bei dem ausgewählten Index von ListBoxEinnahmen gelöscht werden? Ich weiß nämlich nicht, wie ich die Indexauswahl um 1 erhöhen kann.

    Hoffe die Beschreibung war detailliert genug - Auszüge aus dem Code gibt's natürlich noch, wenn ihr etwas brauchen solltet! Bitte seid nicht gleich zu streng, da ich noch ein blutiger Anfänger bin...
    Danke schon mal! :)

    Gruß MS95

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

    1) Hältst du die Daten redundant in 3 Listboxen exakt gleich?
    Da würde ich doch die Listboxen an eine zentrale Struktur binden.
    2) ListBoxEinnahmen.Items.RemoveAt(ListBoxEinnahmen.SelectedIndex) führt dazu, dass der SelectedIndex sich verändert, wenn du den Eintrg löschst.
    Speichere erst den Index ab und lösche den dann aus allen 3 Listboxen
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,
    danke für deine schnelle Antwort! :)
    Nein, in ListboxEinnahmen steht z.B. "2000", in ListBoxBezeichnung "Gehalt" und in ListbBoxKommtAm "15" und wenn ich nun in der GUI auf 2000 in ListBoxEinnahmen klicke, werden alle 3 Daten ausgewählt und diese sollen dann auch zusammen durch den Knopfdruck gelöscht werden - damit dann später bei mehreren Daten kein Durcheinander herrscht.

    Das sich der SelectedIndex verändert habe ich verstanden, aber gibt es keine Lösung dann praktisch zu sagen "nehme SelectedIndex von ListBoxEinnahmen +1"?

    Wie würde das Ganze dann mit dem abspeichern aussehen? Tut mir Leid, dass ich hier solche Fragen stellen muss, aber wie gesagt ich bin noch ganz am Anfang.
    Nein, das meine ich nicht.

    Visual Basic-Quellcode

    1. Private Sub ButtonAusgewaehlteFelderLeeren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAusgewaehlteDatenEntfernen.Click
    2. Dim i=ListBoxEinnahmen.SelectedIndex
    3. ListBoxEinnahmen.Items.RemoveAt(i)
    4. ListBoxBezeichnung1.Items.RemoveAt(i)
    5. ListBoxKommtAm.Items.RemoveAt(i)
    6. End Sub

    @WhitePage du bist mein Held! Es funktioniert endlich! Vielen vielen Dank dafür! :)
    Jetzt habe ich aber noch folgendes Problem:
    Es gibt jetzt zusätzlich zu den 3 genannten Listboxen noch 3 weitere, und zwar "ListBoxAusgaben", "ListBoxBezeichnung2" und "ListBoxFaelligAm".
    Wenn ich jetzt den Code von @WhitePage so erweitere:

    VB.NET-Quellcode

    1. Private Sub ButtonAusgewaehlteFelderLeeren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAusgewaehlteDatenEntfernen.Click
    2. Dim i = ListBoxEinnahmen.SelectedIndex
    3. Dim j = ListBoxAusgaben.SelectedIndex
    4. ListBoxEinnahmen.Items.RemoveAt(i)
    5. ListBoxBezeichnung1.Items.RemoveAt(i)
    6. ListBoxKommtAm.Items.RemoveAt(i)
    7. ListBoxAusgaben.Items.RemoveAt(j)
    8. ListBoxBezeichnung2.Items.RemoveAt(j)
    9. ListBoxFaelligAm.Items.RemoveAt(j)
    10. End Sub


    Stürzt mein Programm wieder ab und gibt mir wieder den Fehler an, dass Index mit dem Wert 1 nichts anfangen kann... Hilfe ?(

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

    Hallo @fichz,
    danke für deine Antwort! :) Okay, das würde ich mir als nächstes anschauen. Aber rein aus Interesse... wie könnte ich das oben genannte Problem lösen? Das lässt mir keine Ruhe und bevor ich das mit dem Datagrid probiere möchte ich, dass das da funktioniert :/
    @WhitePage peinlich... ich wähle ja immer nur einen Eintrag aus und will diesen löschen... Wie kann ich es nun mit einer If-Schleife regeln?

    VB.NET-Quellcode

    1. If ListBoxEinnahmen.SelectedIndex = 0 Then
    2. ListBoxAusgaben.Items.RemoveAt(j)
    3. ListBoxBezeichnung2.Items.RemoveAt(j)
    4. ListBoxFaelligAm.Items.RemoveAt(j)
    5. Else
    6. ListBoxEinnahmen.Items.RemoveAt(i)
    7. ListBoxBezeichnung1.Items.RemoveAt(i)
    8. ListBoxKommtAm.Items.RemoveAt(i)
    9. End If


    Wie kann ich abfragen, ob KEIN Index ausgewählt ist?

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

    MS95 schrieb:

    Hallo @fichz,
    danke für deine Antwort! :) Okay, das würde ich mir als nächstes anschauen. Aber rein aus Interesse... wie könnte ich das oben genannte Problem lösen? Das lässt mir keine Ruhe und bevor ich das mit dem Datagrid probiere möchte ich, dass das da funktioniert :/
    Das ist keine gute Idee, sich darin zu verbeissen.

    Lerne lieber, wie mans richtig macht.

    Weil du bist dabei, Databinding neu zu erfinden. Das ist vonne Kreativität und Denkweise her sehr gut, aber wird im Ergebnis immer wesentlich schlechter sein, als das Databinding, wasses schon gibt.

    Ich hab mal eine Lösung angehängt, die verwendet Databinding sowohl mit Listboxen als auch mit Dgv

    Der architektonische Haupt-Unterschied ist, dass du iwie 3 Listen hast, und die parallel führen willst.
    Viel besser ist aber, daraus eine Liste zu machen, und jedes Listen-Element hat 3 Properties, nämlich: Bezeichnung, KommtAm und Einnahme.
    Diese 3 Dinge gehören ja unbedingt zusammen, und sollten daher gemeinsam eine Klasse ausmachen.
    In diesem Fall ist sogar von Datensatz zu sprechen, und so habich das auch umgesetzt.

    Einfach downloaden, entpacken, starten
    Dateien
    • TableView.zip

      (19,98 kB, 107 mal heruntergeladen, zuletzt: )

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

    ähm - das ist allerdings nur ein Schlaglicht, was aufzeigt, wie mans macht, wenn man weiß wies geht.
    Um sowas selbst entwickeln zu können, muss man einen Haufen an Grundlagen erlernen.

    Datenverarbeitungs-Vorraussetzungen

    (Zumindest punkt 1 solltest du unverzüglich umsetzen, auch wenn du nix vonne Begründung verstehst.)

    Es führt allerdings leider auch kein Weg an diesem Lernpensum vorbei - alles andere führt in die eine oder andere Eigen-Entwicklung, die vom Gesichtspunkt des Databinding-Standards aber nur als Crap angesehen werden kann.
    @MS95 Schau mal bitte hier rein: [Allgemein] VB.NET, VB6, VBA, VBS — Mit welcher Sprache programmiere ich eigentlich? und setze beim nächsten Mal Thread-Label und VB-BBCode korrekt. ;)
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum