ComboBox springt automatisch auf SelectedIndex = -1

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

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

    ComboBox springt automatisch auf SelectedIndex = -1

    Servus zusammen,

    zunächst einmal Danke für die vielen Beiträge in dem Forum - das hat mir schon sehr oft geholfen. Jetzt stehe ich aber selber vor einem Problem, zu dem ich noch nichts finden konnte und deshalb verfasse ich hier mal meinen ersten Beitrag.

    Aber fangen wir mal von vorne an...

    Ich möchte Messdaten aus einer MySQL-Datenbank auslesen, wobei in der Tabellen die folgenden Spalten vorhanden sind: id, time, machine_id, tool_id, input_type, input_content, project_id.
    Die Daten sollen in einem Graphen (Y-Achse: Double, X-Achse: Date) dargestellt werden. Dabei möchte ich aber über Comboboxen nach project_id und tool_id links und tool_id rechts filtern können. Es gibt also 3 ComboBoxen die enstrechend cbox_ident, cbox_tools_left und cbox_tools_right heißen.

    Wenn eine Maschine ausgewählt wird, wird cbox_ident befüllt:

    VB.NET-Quellcode

    1. Sub loadIdents()
    2. 'Fill cbox_ident
    3. Dim ident As String
    4. Dim list_ident As New List(Of String)
    5. list_ident.Clear()
    6. list_ident.Add("All idents")
    7. Try
    8. con.Open()
    9. cmd.CommandText = "Select project_id FROM cdb.userinputlog WHERE machine_id ='" & machineID & "';"
    10. reader = cmd.ExecuteReader
    11. Do While reader.Read
    12. ident = reader("project_id")
    13. list_ident.Add(ident)
    14. Loop
    15. Catch ex As Exception
    16. MsgBox(ex.Message)
    17. End Try
    18. con.Close()
    19. 'Duplikate entfernen und in cbox schreiben
    20. Dim list_ident_clear As New List(Of String)
    21. list_ident_clear = list_ident.Distinct().ToList
    22. cbox_ident.DataSource = list_ident_clear
    23. End Sub



    Bei dem Change-Event von cbox_ident werden cbox_tools_left und cbox_tools_right befüllt, da für bestimmte Idente nur bestimmte Tools verwendet werden:

    VB.NET-Quellcode

    1. Private Sub cbox_ident_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbox_ident.SelectedIndexChanged
    2. Call loadTools()
    3. Call Datenbankabfrage_Visualisierung()
    4. End Sub


    Wobei loadTools() so aussieht:

    VB.NET-Quellcode

    1. Sub loadTools()
    2. 'Ident
    3. If cbox_ident.Text = "All idents" Then
    4. commandStringIdents = "IS NOT NULL"
    5. Else
    6. commandStringIdents = "= '" & cbox_ident.Text & "'"
    7. End If
    8. 'Fill cbox_tool left
    9. Dim tool As String
    10. Dim list_tools As New List(Of String)
    11. list_tools.Clear()
    12. list_tools.Add("All tools")
    13. Try
    14. con.Open()
    15. cmd.CommandText = "Select tool_id FROM cdb.userinputlog WHERE machine_id ='" & machineID & "' AND project_id " & commandStringIdents & " AND input_type = 'bending_K_0_left';"
    16. reader = cmd.ExecuteReader
    17. Do While reader.Read
    18. tool = reader("tool_id")
    19. list_tools.Add(tool)
    20. Loop
    21. Catch ex As Exception
    22. MsgBox(ex.Message)
    23. End Try
    24. con.Close()
    25. 'Duplikate entfernen und in cbox schreiben
    26. Dim list_tools_clear As New List(Of String)
    27. list_tools_clear = list_tools.Distinct().ToList
    28. cbox_tools_left.DataSource = list_tools_clear
    29. 'Fill cbox_tool right
    30. list_tools.Clear()
    31. list_tools.Add("All tools")
    32. Try
    33. con.Open()
    34. cmd.CommandText = "Select tool_id FROM cdb.userinputlog WHERE machine_id ='" & machineID & "' AND project_id " & commandStringIdents & " AND input_type = 'bending_K_0_right';"
    35. reader = cmd.ExecuteReader
    36. Do While reader.Read
    37. tool = reader("tool_id")
    38. list_tools.Add(tool)
    39. Loop
    40. Catch ex As Exception
    41. MsgBox(ex.Message)
    42. End Try
    43. con.Close()
    44. 'Duplikate entfernen und in cbox schreiben
    45. list_tools_clear.Clear()
    46. list_tools_clear = list_tools.Distinct().ToList
    47. cbox_tools_right.DataSource = list_tools_clear
    48. End Sub


    In Datenbankabfrage_Visualisierung werden abhängig von gewähltem Ident und gewählten Tools die eigentlichen Daten aus der Datenbank abgefragt, in DataTables gespeichert und anschließend im Chart dargestellt.

    Nun zu meinem Problem:
    Es funktioniert soweit alles gut. Wenn ich aber, nachdem ich die ComboBoxen für die Tools befüllt habe, über das DropDown ein Tool anklicke, übernimmt der das kurz, aber danach wird automatisch auf SelectedIndex = -1 gestellt. Es wird also wie im unten stehenden Code das SlectedIndexChanged Event zweimal ausgeführt - einmal mit dem von mir ausgewählten Tool und dann nochmal mit dem automatisch gesetzten Index -1.

    VB.NET-Quellcode

    1. Private Sub cbox_tools_left_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbox_tools_left.SelectedIndexChanged
    2. Call Datenbankabfrage_Visualisierung()
    3. End Sub


    Ich kann mir einfach nicht erklären, warum auf einmal der Index von der ComboBox automatisch auf -1 gesetzt wird, ohne dass ich irgendwo einen entsprechenden Befehl gebe.
    Hat einer von Euch schonmal eine ähnliche Erfahrung gemacht? Oder ist das automatische Setzen auf Index -1 möglicherweise eine "Sicherheitsvorkehrung" für irgendwas?

    Ich stehe echt auf dem Schlauch. Wäre cool, wenn Ihr mich dabei unterstützen könntet.
    Ich hoffe, ich habe mein Problem verständlich rüberbringen können. Ansonsten gebt gerne Bescheid, und ich versuche es nochmal besser oder detaillierter zu erklären.

    Danke vorab für Euren Support und Gruß
    Jonas
    Willkommen im Forum. :thumbup:

    jonrem schrieb:

    ohne dass ich irgendwo einen entsprechenden Befehl gebe.
    Die Frage ist, was in der Prozedur Datenbankabfrage_Visualisierung() passiert.
    Das Zauberwort heißt Debuggen: Debuggen, Fehler finden und beseitigen
    Setze in diese Prozedur einen Haltepunkt, zieh cbox_tools_left.SelectedIndex in das Überwachen-Fenster (unter dem Quellcode).
    Steppe den Code zeilenweise durch und pass auf, wann da aus dem richtigen Wert die -1 wird.
    Dann untersuche, was da wirklich passiert.
    Behebe den Fehler und feddich. ;)
    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!
    Danke für deine Antwort!
    Aber genau das habe ich schon (gefühlt 1000 Mal) gemacht (habe ich oben vergessen zu erwähnen...). Während ich Zeile für Zeile im Code durchgehe, ändert sich bei dem Index absolut nichts. Er steht wie erwartet auf dem ausgewählten Index.
    Sobald aber End Sub von cbox_tools_left_SelectedIndexChanged erreicht wird, springt der Index auf einmal auf -1. Durch den erneuten IndexChange, wird die Sub dann wiederholt...
    @jonrem MAch mal ein kleines Testprogramm ohne Datenbank, schreib statt dessen ein paar äquivalente Strings rein.
    Versuche damit, den Effekt nachzustellen.
    Wenn es klappt, poste das komplette bereinigte (ohne bon, obj, .vs-Ordner) und gezippte Projekt.
    Eweiterte Antwort => Dateianhänge => Hochladen.
    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!
    Grundsätzlich wird SelectedIndex auf -1 gesetzt, wenn der ComboBox-Inhalt neu bestückt/geladen wird.

    RodFromGermany schrieb:

    Die Frage ist, was in der Prozedur Datenbankabfrage_Visualisierung() passiert.
    In der Sub wird definitiv der Wurm drin sein.

    btw: Das Schlüsselwort Call sollte nicht mehr verwendet werden. Es gibt nur ein paar wenige Ausnahmen, aber hier kann es ersatzlos gestrichen 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.
    @RodFromGermany
    Ich habe Deinen Tipp befolgt und ein abgeändertes Programm geschrieben, wo die ComboBoxen nicht mehr aus der Datenbank sondern manuell mit String befüllt werden - und siehe da, es funktioniert. Es liegt also an dem Befüllen an sich.
    Dann habe ich da nochmal genauer nachgeschaut, woran es liegen könnte. In meinem Programm habe ich das so gelöst, dass ich die Tools erst in eine List(Of String) geschrieben habe und diese dann als DataSource für die ComboBox verwendet habe.
    Allerdings habe ich erst die linken Tools und dann die rechten Tools befüllt - dafür aber die selbe List verwendet, was sich als falsch heraus gestellt hat. Jetzt habe ich für links und rechts eigene Lists und so funktioniert es auch mit dem Beladen aus der Datenbank.

    Das Problem ist also gelöst.
    @RodFromGermany & @VaporiZed, Dankeschön für Eure Unterstützung und Eure Hinweise!

    Kann ich das Thema irgendwo als erledigt markieren?
    Oben rechts neben dem Titel Doppelklick auf die rote Box [ ].
    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.