Arbeiten und Auslesen einer Combobox mit mehr als einem Item

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von LizardProgrammer.

    Arbeiten und Auslesen einer Combobox mit mehr als einem Item

    Hallo :)

    hier mein Problem:
    Ich habe eine Combobox, in der mehrere Werte/Items stehen können. Wenn ich ein Item dieser Liste auswähle soll ein Ereignis starten. Der gewählte Wert soll auf einen String geschrieben werden und damit
    soll eine DataGridView durchlaufen/durchsucht/gefiltert werden. Solange ein Wert in der Combobox steht läuft alles wie es soll. Stehen aber mehr als ein item in dr Combobox, dann zeigt mir Visual Studio einen Index-Fehler an. Kann mir jemand helfen bei dem Problem? Hab bereits einiges probiert und weiß nicht mehr weiter. Da die Indizes der dgv in der if-bedingung korrekt sind (mehrmals geprüft :S ) nehme ich an, dass der Fehler was mit der Auswahl des Items der Combobox sein muss oder ähnlichen.

    Hier ein Teil meines Codes:

    VB.NET-Quellcode

    1. Private Sub cb_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cb.SelectionChangeCommitted
    2. Dim cb as String
    3. cb = cb.selected item
    4. for i = 0 to dgv.rows.count - 1
    5. if cb = dgv.rows.item(i).cells.item(3) then
    6. '...
    7. End if
    8. next
    9. End Sub


    Verschoben. ~Thunderbolt

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

    VB.NET-Quellcode

    1. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    2. If Not ComboBox1.SelectedItem Is Nothing And Not ComboBox1.Items.Count < 1 Then
    3. 'Tu was mit ComboBox1.SelectedValue.ToString
    4. 'Tu was mit ComboBox1.SelectedValue
    5. 'Tu was mit ComboBox1.SelectedItem
    6. 'Tu was mit ComboBox1.SelectedItem.ToString()
    7. End If
    8. End Sub


    Wenn du mit einer BindingSource arbeitest kannst du z.B. MyBindingSource.Filter = $"Name = like '%{combobox1.selectedvalue.tostring}%'" sowas hier machen zum Filtern.
    Danke für deine Antwort :) Ich habe aber gleich mal eine Gegenfrage:
    1. Kann ich für mein Problem nicht mit Private Sub Combobox_SelectionChangeComitted arbeiten? Und wenn nicht, wann verwende ich es dann?
    2. Kann ich nicht mit den items selbst, also den Strings arbeiten? Muss ich mit den Indizes arbeiten?
    3. Falls du meinen Fehler verstanden hast bzw. kennst, kannst du mir sagen wo das Problem liegt?

    Vollzitat entfernt. ~Thunderbolt

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

    LizardProgrammer schrieb:

    If Not ComboBox1.SelectedItem Is Nothing And Not ComboBox1.Items.Count < 1 Then
    ist eine komische Konstruktion.

    VB.NET-Quellcode

    1. ​If ComboBox1.Items.Count > 0 AndAlso ComboBox1.SelectedItem IsNot Nothing Then

    Hat zwar wahrscheinlich nichts mit deinem Problem zu tun, aber ist sauberer.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Der Code ist nicht mit Option Strict On versehen.
    Der Code ist nicht aus dem Projekt, da

    VB.NET-Quellcode

    1. Dim cb as String
    2. cb = cb.selected item
    bei = cb.selected item syntaktisch falsch ist und cb nicht doppelt verwendet werden kann, und zwar 1x als ComboBox-Name und als String; die Stringvariable würde die ComboBox-Instanz überdecken.
    Sobald man diese Fehler beseitigt hat, dafür sorgt, dass das DGV genügend Spalten hat (> 3) und das manuelle Hinzufügen von neuen Zeilen deaktiviert ist (sonst crasht es bei Zeile#4), sollte der Code laufen. Zumindest läuft er bei mir.
    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.
    Also ich hab da jetzt was umgestellt:

    VB.NET-Quellcode

    1. Private Sub cb_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cb.SelectionChangeCommitted
    2. Dim bsp as String
    3. bsp = cb.selecteditem
    4. Dim index as integer = 0
    5. for i = 0 to dgv.rows.count - 2
    6. Dim bspaktuell as String
    7. bspaktuell = dgv.rows.item(i).cells.item(3).value
    8. if bsp = bspaktuell then
    9. dgv2.rows.ad()
    10. dgv2.rows(index).cells.item(0).value = dgv.rows.item(i).cells.item(1).value 'Hier wird ein Index-Fehler angezeigt
    11. '...
    12. index += 1
    13. End if
    14. next
    15. End Sub


    Ich kann den Fehler nicht nachvollziehen. Also es funktioniert, wenn ich dgv2.rows.add() aus der if-bedingung rausziehe. Allerdings habe ich dann in dgv2 mehrere leere Zeilen. Das würde ich gerne umgehen. Kann mir jemand sagen, wo der Fehler liegt?
    Es wäre vorteilhaft, Deinen tatsächlichen Code zu zeigen, denn Zeile#10 mit dgv.rows.item(i).cells.item(1).value ist wieder syntaktisch falsch und somit nicht kompilierbar.
    Auch ein Screenshot der Fehlermeldung wäre hilfreich, da die schon sehr genau sagt, wo das Problem liegt. Ist das Problem bei i? index? .item(0)? .item(1)? .value?
    Denn am Ende kommt raus, dass irgendwo eine Kleinigkeit, die im Originalcode drinsteht, hier nicht gepostet wurde und wir etwas suchen, was nicht vorhanden ist.

    Hier im Forum wird so viel Code gepostet, die Angst, dass da was geklaut wird, tendiert gegen Null. Bedenke auch, dass viele, die hier antworten, ein paar mehr Posts haben und so es sehr wahrscheinlich ist, dass viel Erfahrung dahintersteckt. Es ist zwar Spekulatius, aber ich tippe mal darauf, dass das Verhältnis Postcount zu selbstgeschriebenen Codezeilen bei 1:100 liegt. oder noch krasser. Somit dürfte das, was Du versuchst, schon alter Hut sein.
    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.
    @VaporiZed Mir geht es nicht um das klauen von dem Code, sondern eher um den Inhalt, der mit Hilfe des Codes verarbeitet werden soll :)

    Also hier mal mein Code zu dem Abschnitt wo es hakt (die Variablennamen und etc. habe ich umbenannt)

    VB.NET-Quellcode

    1. Private Sub cb_res_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cb_res.SelectionChangeCommitted
    2. Dim res As String
    3. res= cb_rsrc.SelectedItem 'Auslesen der gewählten Ressource aus der Combobox
    4. Dim tt, source, hu, id As String
    5. dgv_task.rows.clear() 'Löschen des vorherigen Tabelleleninhalts
    6. dgv_task = mod_glob.ColTask(dgv_tast) 'Hinzufügen von Spalten & Überschriften
    7. Dim row as Integer = 0
    8. if rb_move.checked then
    9. For i = 0 to dgv1.rows.count - 2
    10. tt = dgv1.rows.item(i).cells.item(12).value 'Werte aus aktueller Zeile auslesen
    11. source = dgv1.rows.item(i).cells.item(14).value 'Werte aus aktueller Zeile auslesen
    12. hu = dgv1.rows.item(i).cells.item(16).value 'Werte aus aktueller Zeile auslesen
    13. id = dgv1.rows.item(i).cells.item(18).value 'Werte aus aktueller Zeile auslesen
    14. dgv_task.rows.add()
    15. if res = source then
    16. if tt = "MOVE" OR tt = "STOP" then
    17. dgv_task.Rows.Item(Row).Cells.Item(0).Value = dgv1.Rows.Item(i).Cells.Item(0).Value 'Hier Kommt der Index Fehler.
    18. dgv_task.Rows.Item(Row).Cells.Item(1).Value = dgv1.Rows.Item(i).Cells.Item(1).Value
    19. dgv_task.Rows.Item(Row).Cells.Item(2).Value = "0"
    20. dgv_task.Rows.Item(Row).Cells.Item(3).Value = "00"
    21. dgv_task.Rows.Item(Row).Cells.Item(4).Value = dgv1.Rows.Item(i).Cells.Item(7).Value
    22. dgv_task.Rows.Item(Row).Cells.Item(5).Value = dgv1.Rows.Item(i).Cells.Item(8).Value
    23. dgv_task.Rows.Item(Row).Cells.Item(6).Value = dgv1.Rows.Item(i).Cells.Item(12).Value
    24. dgv_task.Rows.Item(Row).Cells.Item(7).Value = dgv1.Rows.Item(i).Cells.Item(13).Value
    25. dgv_task.Rows.Item(Row).Cells.Item(8).Value = dgv1.Rows.Item(i).Cells.Item(14).Value
    26. dgv_task.Rows.Item(Row).Cells.Item(9).Value = dgv1.Rows.Item(i).Cells.Item(15).Value
    27. dgv_task.Rows.Item(Row).Cells.Item(10).Value = dgv1.Rows.Item(i).Cells.Item(16).Value
    28. dgv_task.Rows.Item(Row).Cells.Item(11).Value =dgv1.Rows.Item(i).Cells.Item(18).Value
    29. if dgv1.rows.item(i+1).cells.item(12).value = "STOP" And hu = dgv1.rows.item(i+1).cells.item(16).value And id = dgv1.rows.item(i+1).cells.item(18).value then
    30. dgv_task.rows.item(Row).Cells.item(2).value = dgv1.rows.item(i+1).cells.item(1).value
    31. end if
    32. end if
    33. end if
    34. row += 1
    35. next
    36. For each line in dgv_task.rows
    37. if line.cells.item(2).value = "0" And line.cells.item(6).value = "STOP" then
    38. dgv_task.rows.remove(line)
    39. end if
    40. next
    41. end if
    42. End Sub


    Also wie gesagt, wenn ich nur ein Object/item in der Combobox zur Auswahl habe, dann funktioniert alles einwandfrei. Bei mehreren gibt es da allerdings ein Problem.
    Dann zeigt es mir den Index Fehler in der oben markierten Zeile an. Der Index wäre außerhalb des Bereichs und dürfte nicht null oder negativ sein.
    Dann spalte Zeile#17 mal in folgendes auf:

    VB.NET-Quellcode

    1. Dim Row = dgv_task.Rows.Item(Row)
    2. Dim Cell = Row.Cells.Item(0)
    3. Dim Value= Cell.Value
    4. Dim Row2 = dgv1.Rows.Item(i)
    5. Dim Cell2 = Row2.Cells.Item(0)
    6. Dim Value2 = Cell2.Value

    wo kommt jetzt der Fehler?
    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.
    (zeile #17)
    Ich find den Code höchst verwirrend - iwie fahren mir da zuviele Dgvs drin rum (dgv_task, dgv_tast, dgv1).
    Und der Index-Fehler mag sich daraus ergeben, dass dgv1 mehr Zeilen hat als dgv_Task:

    VB.NET-Quellcode

    1. [...]
    2. dgv_task.rows.clear() 'Löschen des vorherigen Tabelleleninhalts
    3. dgv_task = mod_glob.ColTask(dgv_tast) 'Hinzufügen von Spalten & Überschriften
    4. [...]
    5. Dim row As Integer = 0
    6. For i = 0 To dgv1.rows.count - 2
    7. [...]
    8. If res = source Then
    9. If tt = "MOVE" Or tt = "STOP" Then
    10. dgv_task.Rows.Item(Row).Cells.Item(0).Value = dgv1.Rows.Item(i).Cells.Item(0).Value 'Hier Kommt der Index Fehler.
    11. [...]
    12. row += 1
    13. Next
    Ich glaube nicht, da dgv_task-Rows mit Row indiziert werden, während bei dgv1-Rows das mit i passiert. Und in Zeile#14 wird ja immer eine Zeile zu dgv_task hinzugefügt, bevor in Z#34 deren Index erhöht wird.
    Allerdings fällt mir gerade auf, dass das Konstrukt in Z#29 mit dem i+1 auch nicht grad stabil aussieht. Alles sehr kompliziert.
    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.

    LizardProgrammer schrieb:

    das dgv_tast war ein Tippfehler.

    hmpf!
    Irgendwie ist mir, als hätte man dich nu schon mehrfach aufgefordert, deinen Code so zu zeigen, wie er wirklich ist.
    Nicht abgetippt, nicht anonymisiert, nicht so ähnlichen Code, sondern genau den Code, der Probleme macht.

    Copy & Paste ist Trumpf!