Combobox gibt falschen Wert raus

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Lord Luxor.

    Combobox gibt falschen Wert raus

    Hallo,

    bin mir jetzt nicht sicher ob das ein DB- oder ein Programmier-Issue ist. Daher öffne ich das Thema mal hier. Falls ich doch falsch liege, bitte verschieben. Danke.

    Ich habe Maske mit drei Datensätzen, die drei Comboboxen beinhalten, die ich mittels einer DataTable befülle.

    VB.NET-Quellcode

    1. If OpenDB() Then
    2. sqlCmd.Connection = Conn
    3. sqlCmd.CommandText = "SELECT * From fisms_risikoklassen_3 Order by id"
    4. DtA.SelectCommand = sqlCmd
    5. DtA.Fill(sqlDt)
    6. For Each row In sqlDt.AsEnumerable()
    7. color_name = ""
    8. rk_id = CInt(row("id"))
    9. rk_name = CStr(row("rk_name"))
    10. rk_color = CInt(row("rk_color"))
    11. rk_text = CStr(row("rk_text"))
    12. If rk_id = 1 Then
    13. TB_rk3_1.Text = rk_name
    14. color_name = get_color(CInt(rk_color))
    15. CB_rk3_color1.BackColor = Color.FromName(color_name)
    16. CB_rk3_color1.SelectedValue = rk_color
    17. MsgBox("ID: " + CStr(rk_id) + " RK_Color: " + CStr(rk_color) + " SelVal: " + CStr(CB_rk3_color1.SelectedValue))
    18. CB_rk3_color1.Text = color_name
    19. TB_rk3_text1.Text = rk_text
    20. End If
    21. If rk_id = 2 Then
    22. TB_rk3_2.Text = rk_name
    23. color_name = get_color(CInt(rk_color))
    24. CB_rk3_color2.BackColor = Color.FromName(color_name)
    25. CB_rk3_color2.SelectedValue = rk_color
    26. MsgBox("ID: " + CStr(rk_id) + " RK_Color: " + CStr(rk_color) + " SelVal: " + CStr(CB_rk3_color2.SelectedValue))
    27. CB_rk3_color2.Text = color_name
    28. TB_rk3_text2.Text = rk_text
    29. End If
    30. If rk_id = 3 Then
    31. TB_rk3_3.Text = rk_name
    32. color_name = get_color(CInt(rk_color))
    33. CB_rk3_color3.BackColor = Color.FromName(color_name)
    34. CB_rk3_color3.SelectedValue = rk_color
    35. MsgBox("ID: " + CStr(rk_id) + " RK_Color: " + CStr(rk_color) + " SelVal: " + CStr(CB_rk3_color3.SelectedValue))
    36. CB_rk3_color3.Text = color_name
    37. TB_rk3_text3.Text = rk_text
    38. End If
    39. Next
    40. sqlDt.Clear()
    41. Conn.Close()
    42. Conn.Dispose()
    43. End If


    Die Funktion get_color soll aus dem Integer-Wert aus einer Tabelle mit Farben den entsprechenden Farbnamen ausgeben.

    VB.NET-Quellcode

    1. Public Function get_color(color_id As Integer) As String
    2. Dim result As String = ""
    3. Dim col_id As Integer = 0
    4. Dim col_name As String = ""
    5. Dim a_row As DataRow
    6. If OpenDB() Then
    7. If IsDBNull(color_id) Then
    8. color_id = 10
    9. End If
    10. sqlCmd.Connection = Conn
    11. sqlCmd.CommandText = "SELECT * From fisms_availablecolors ORDER BY id"
    12. DtA.SelectCommand = sqlCmd
    13. DtA.Fill(xsqlDt)
    14. a_row = xsqlDt.Select("[id] = '" & CStr(color_id) & "'").FirstOrDefault()
    15. If Not a_row Is Nothing Then
    16. col_name = CStr(a_row.Item("color_name"))
    17. Else
    18. col_name = "white"
    19. End If
    20. result = col_name
    21. xsqlDt.Clear()
    22. Conn.Close()
    23. Conn.Dispose()
    24. Else
    25. MsgBox("Kann Datenbank nicht öffnen")
    26. End If
    27. Return result
    28. End Function


    Mein Ziel war, anhand die Comboboxen mit der entsprechenden Hintergrundfarbe und dem Farbnamen zu befüllen. Die Msgboxen habe ich eingebaut um dem Fehler auf die Schliche zu kommen.

    Folgendes Phänomen. Ich lese aus der Datenbanktabelle "risikokategorien" die Werte 1 = green, 2 = yellow und 4 = red, die Nummern sind auch gleichzeitig die ID (auto_inc) in der Datenbanktabelle "availablecolors".
    Die Comboboxen sind mittels Datasource an die Tabelle "availablecolors" gebunden, Valuemember "id" und Displaymember "color_name".
    Ich lassen anhand der aus der Tabelle "risikokategorie" ausgelesenen Farbe die Hintergrundfarbe der Combobox angleichen und mit der get_color-Funktion will ich den Farbname in die Combobox als aktuelle Selektion schreiben.
    Die Hintergrundfarbe funktioniert. Nur der Farbname, hier wird der letzte gelesene Farbname aus der Datatable genommen (in der aktuellen Reihenfolge 4 = red).



    Anhand der Messageboxen sehe ich, dass die richtigen Werte aus der DataTable gelesen werden. Trotzdem werden die Comboboxen vom Text gleich geschaltet.

    Und jetzt wird es noch schräger, wenn ich über eine beliebige Combobox die Farbauswahl ändere, bekommen alle anderen auch die gleiche Farbauswahl.

    Habe ich unwissentlich irgendeine Verknüpfung der Comboboxen eingerichtet? Oder liegt das vielleicht doch an der DataTable?

    Was mache ich hier falsch?

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Lerne richtig zu Debuggen. Setze einen Breakpoint und arbeite dich Schrittweise durch deinen Code. Prüfe ob er das macht was er soll und auch ob alle Variablen die erwarteten Werte haben. Wie „Debuggen“ geht, steht in meiner Signatur.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Schau mal nach, ob bei den ComboBox-Eigenschaften Unterpunkt DataBinding die Text-Property an irgendwas gebunden ist. Das könnte ein Problem sein.

    ##########

    Öhm. Die ComboBoxen sind schon an drei verschiedene BindingSources angebunden, oder?
    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 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hmm, ich habe mit Haltepunkten gearbeitet und die Zeilen eine nach der anderen durchlaufen lassen. Dabei fiel mir auf, sobald ich aus der DataTable die nächste Farbe geholt habe, wurden die schon befüllten Comboboxen mit den neu gelesenen Wert überschrieben. Ich habe auch den SQL Query umgeschrieben und einen JOIN eingebaut, damit spare ich mir die separate Abfrage der Farbtabelle und bekomme in der DataTable alle benötigten Werte beider Tabellen. Gebracht hat es leider nichts.
    Sobald er aus der DataTable den Namen der Farbe in die Variable liest, überschreibt er die Werte der vorigen ComboBoxen. Nur nicht die BackColor-Eigenschaft.

    Auch der Abschnitt DataBinding ist leer, bzw. steht alles auf "Keine".

    Ich schreibe jetzt den Code nochmal komplett um.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Hattest Du meine Frage gelesen? Hat jede ComboBox ihre eigene BindingSource? Denn wenn nicht, zeigen alle ComboBoxen den selben Wert an: den vom BindingSource.Current
    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.
    Sorry, nein den letzten Satz hatte ich nicht gesehen. Und da ist dann wohl auch mein Fehler. Die verweisen alle auf die gleiche Bindingsource. Im Klartext, habe ich ein Formular mit 10 Comboboxen die auf die gleiche Datenbanktabelle verweisen, dann brauche ich 10 Bindingsources, weil sonst alle Comboboxen den gleichen Wert bekommen?

    Probiere ich morgen aus - will jetzt nur noch ein Bier und mich mit Netflix vor den TV werfen.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Korrekt. Eine DataTable hat z.B. 20 Zeilen/Einträge.
    Eine BindingSource (BS), die an diese DataTable gebunden wird, zeigt immer auf einen Eintrag, beschrieben durch BindingSource.Position (Zeilenindex in der Tabelle) und BindingSource.Current (eine Repräsentation der DataTable-Zeile an der gewählten Position). Wenn 5 ComboBoxen an dieselbe BS gekoppelt werden, zeigen sie alle auf dieselbe DataTable-Zeile. Ändert sich diese, ändern sich in allen ComboBoxen die Werte gleichzeitig. Wenn also alle ComboBoxen unabhängig voneinander sein sollen, braucht jede ComboBox ihre eigene BS. Trotzdem wird natürlich jede BS an dieselbe DataTable gebunden. Aber jede BS repräsentiert dann eben eine eigene DataTable-Zeile. Werden dann (warum auch immer) 2 BSs auf dieselbe Position gestellt, wird in den 2 entsprechenden ComboBoxen zwar dasselbe angezeigt. Aber das ist nebensächlich. Denn normalerweise macht man das nicht.
    btw: wozu eigentlich ne ComboBox? Soll da was auswählbar 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.
    Es ist wirklich immer wieder erstaunlich. Kaum macht man es richtig, funktioniert es.
    Danke, für den entscheidenden Tipp. Ich muss immer wieder feststellen, VB.Net ist komplexer als ich angenommen hatte und auch die Bücher darstellen.
    Ich kenne ähnliche Konstrukte im Domino-Umfeld, aber da ist die DataTable multilateral nutzbar, da muss ich echt aufpassen, da ich in beiden Umfelder programmiere.

    PS: Ja die Comoboboxen sind dafür gedacht Farben für die Risikoklassen auszuwählen. Daher habe ich diese als Combobox gewählt.

    Bye
    Markus

    Nachtrag: Hab das jetzt komplett umgestellt, mit ColorDialog und Textboxen, die die Farbe anzeigen. Mit FromARGB lese ich dann die Farbwerte aus und speichere sie in der Datenbank.
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

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