Richtiges Binden von ComboBoxen an DataTables im typ. DataSet

  • VB.NET

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Richtiges Binden von ComboBoxen an DataTables im typ. DataSet

    Hallo,

    ich habe mehrere Tabellen, die in Relation zueinander stehen (relevanter Ausschnitt aus dem DataSet auf dem Bild).



    Jetzt will ich eine Form erstellen, in der der User erst das OrgByte, dann die zugehörigen FuncBytes und dann die zugehörigen TypeByteValue auswählt (also 3 ComboBoxen). Wie muss man denn die Bindings wählen, damit es funktioniert? Die OrgByte habe ich gebunden, das klappt, aber der Rest zeigt einfach alles an. Oder muss da eine LINQ-Abfrage ran?

    Noch netter wäre es, wenn die erste ComboBox Strings enthalten würde, die "OrgByteValue-OrgByteTitle" anzeigen - da muss auch LINQ ran?

    Danke.

    EDIT: richtiges Modell

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

    So, ich habe jetzt was ausprobiert, aber ich bekomme eine Fehlermeldung, mit der ich nicht umgehen kann. ;(

    Ich habe die erste ComboBox an OrgByte gebunden (angezeigt "OrgByteValue", ausgewählt "OrgByteId"). Für die nächste ComboBox (für zugehörige "FuncByteValue") habe ich folgenden Code geschrieben:

    VB.NET-Quellcode

    1. Private Sub OrgByteValueComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OrgByteValueComboBox.SelectedIndexChanged
    2. If OrgByteValueComboBox.SelectedIndex >= 0 Then
    3. Dim fb = From ob In DtsTest.FuncByte Where ob.OrgByteID.ToString Like OrgByteValueComboBox.SelectedValue.ToString
    4. FuncByteValueComboBox.Items.Clear()
    5. For Each fbrow In fb
    6. Dim fbvalue = fbrow.FuncByteValue.ToString
    7. FuncByteValueComboBox.Items.Add(fbvalue)
    8. Next
    9. End If
    10. End Sub


    Wenn ich mir die "fbvalue" jeweils anschaue, ist sie richtig. Aber irgendwann mal kommt diese Fehlermeldung (da wo diese Form aufgerufen wird):


    Was könnte das sein?
    Die Fehlermeldung lag wohl an falscher Bindung (es werden ja zig BindingsSources erstellt :rolleyes: ). Ich habe alles gelöscht und neu gebunden, jetzt bekomme ich keinen Fehler, nur darf ich die 2. ComboBox nicht aufklappen. :?:

    VB.NET-Quellcode

    1. Dim lst As New List(Of String)
    2. Private Sub OrgByteValueComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OrgByteValueComboBox.SelectedIndexChanged
    3. If OrgByteValueComboBox.SelectedIndex >= 0 Then
    4. Dim fb = From ob In DtsTest.FuncByte Where ob.OrgByteID.ToString Like OrgByteValueComboBox.SelectedValue.ToString
    5. lst.Clear()
    6. For Each fbrow In fb
    7. Dim fbvalue = fbrow.FuncByteValue.ToString
    8. lst.Add(fbvalue)
    9. Next
    10. ComboBox1.DataSource = lst
    11. End If
    12. End Sub


    In der List ist alles richtig drin (beim Debuggen geprüft).

    EDIT: Habe jetzt ein Testprojekt angehängt. Die Daten werden beim Starten automatisch geladen, danach auf Button drücken.

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

    Muss in der "dts.xml" irgentwas besonderes stehen?
    Die kann ich in meinem CD-Rom Laufwerk nicht erstellen :)

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. DtsTest.ReadXml("D:\dts.xml")
    3. End Sub
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Oh Mist, sorry.

    Den Pfad dann bitte anpassen.

    Ich habe jetzt eingegrenzt (habe einfach feste Werte der List zugeordnet) - wenn ich auf die zweite ComboBox klicken will, ist trotzdem die erste markiert (hat also Fokus). :?:

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

    sonne75 schrieb:

    Jetzt will ich eine Form erstellen, in der der User erst das OrgByte, dann die zugehörigen FuncBytes und dann die zugehörigen TypeByteValue auswählt (also 3 ComboBoxen).
    Das scheint mir logisch nicht zu gehen: Sind sowohl OrgBytes als auch FuncBytes ausgewählt, dann ergeben sich doch die Profiles-Datensätze daraus.
    Eine 3. Combo kann da nix mehr anwählen - oder?
    Doch, die dritte ComboBox soll die TypeByteValue anzeigen, die sich in der Profil-Tabelle befinden. Der ausgewählte Wert soll dann "Profil-ID" sein, angezeigter Wert eben "TypeByteValue".

    Gut, ohne Bindung geht es ja nicht, aber dann kann ich es mit LINQ immer noch rausholen.

    EDIT: Jetzt habe ich versucht den Fokus manuell auf ComboBox2 zu setzen (nach der .DataSource) und bekomme wieder die Fehlermeldung aus dem Post#2 ;(
    also hab jetzt alle Combos angehängt, und die ganzen Events, die da mit reinpfuschen, rausgeworfen. So zeigt nun jede Combo ihres an - und?

    edit: den nunmehr unnützen Download entfernt - s. weiter u.

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

    Es zeigt nicht die zugehörigen Werte, sondern einfach alle, die es gibt (für alle 4 OrgBytes ingesamt, unabhängig davon, was in der ersten ComboBox ausgewählt wurde). Ich brauche aber so, dass nur die FuncByteValue angezeigt werden, die zu dem OrgByteID gehören, deren OrgByteValue ausgewählt wurde.
    Das war nämlich auch mein erster Gedanke...
    Nein, eben nicht, es muss mit OrgByte anfangen, weil sie erst die Auswahl bestimmen.
    Es gibt 4 OrgBytes, jedes hat eine eigene Liste mit FuncBytes, jedes hat eine Liste mit TypeBytes - und die Kombination davon bestimmt das Profil. Bzw. ist TypeByte Bestandteil des Profils, weil jedes Profil nur eins davon haben kann.

    Hier ist ein Screenshot vom Teil der Profile: erstes Byte von 3 ist OrgByte, 2. FuncByte und 3. Type-Byte.




    Was ich nicht verstehe - meine Abfrage funktioniert ja, ich bekomme jeweil eine richtige Liste. Aber warum funktioniert es mit ComboBoxen danach nicht?

    Die erste ComboBox bleibt dauernd angewählt.

    Und noch eine Frage: bei DataSet.Register wird doch jeweils das DataSet der Form registriert, wie kommt es dazu, dass sie sich trotzdem überschneiden? Woher bekommt das 2.DataSet seine Daten?
    Die erste ComboBox bleibt dauernd angewählt.
    ja, aus dem Datenfenster kann man keine Combos ziehen - da werden Mist-Bindings generiert. Guck einfach, wie ichs gemacht hab.


    Woher bekommt das 2.DataSet seine Daten?
    Beim Registrieren wird es vernichtet und durch das erste Dataset ersetzt, was Registriert wurde :D

    Es gibt 4 OrgBytes, jedes hat eine eigene Liste mit FuncBytes, jedes hat eine Liste mit TypeBytes
    ist nicht ganz eindeutig - also versteh ich richtig:
    1 OrgByte hat viele FuncBytes
    1 FuncByte hat viele TypeBytes

    ?

    oder bedeutet das:
    1 OrgByte hat viele FuncBytes
    1 OrgByte hat viele TypeBytes

    ?
    Ich habe es jetzt komplett ohne .DataSource gemacht, nur mit LINQ-Abfragen. Denn auch eine List als DataSource an die 2.ComboBox zu binden hat nicht funktioniert.

    ErfinderDesRades schrieb:

    1 OrgByte hat viele FuncBytes
    1 FuncByte hat viele TypeBytes


    Das ist richtig, die Hierarchie geht nach unten, man sieht es im Screenshot, den ich angehängt habe.

    ErfinderDesRades schrieb:

    Guck einfach, wie ichs gemacht hab.

    Ich habe bisher nichts anderes gesehen, aber ich schaue es nochmal.
    Wieso soll es falsch sein? Es ist schon alles richtig, wie es ist.
    EDIT: Ach so, stimmt, im Screenshot im ersten Beitrag fehlt eine Relation, ich mache gleich richtiges hier rein.



    Ich habe es jetzt ohne DataBindings, nur mit DataSource (über den Smart-Tag) gebunden (wie in deinem Beispiel-Projekt), jetzt funktioniert es auch (immerhin habe ich jetzt die LINQ-Abfragen alleine hingekriegt :D ).
    Wann darf ich denn aus der Datenquelle ziehen und wann nicht?
    Blöde Frage, was hast du anders als im ersten Beispiel gemacht? Ich sehe an Bindungen keine Unterschiede. :?:

    Wobei ich eigentlich sowieso die Title auch noch brauche (in einer ComboBox, fürchte ich). Es soll also "F6 - Bla Bla" anzeigen.
    Wie kann man das am einfachsten machen?

    Ich brauche jeweils als String "OrgByteValue - OrgByteTitle", "FuncByteValue-FuncByteTitle" usw. Der ausgewählte Wert soll dann der ID entsprechen.
    Ja, es funktioniert, aber ich will ja verstehen, was der Unterschied ist. Ich sehe nur jeweils die zugehörige Bindingssource als Datenquelle. Aber im ersten Beispiel war es doch genau so?

    Und wie kann ich jetzt die Strings für die ComboBox zusammensetzen?

    Und wenn ich z.B. ID von einem Datensatz habe, wie komme ich an eine andere Column?
    wie gesagt: ein Parent-Child-ChildChild - View.
    Wenn du weißt, wie man mit BindingSoruces einen ParentChildView aufbaut, dann liegt dir alles klar vor augen. Gugge im Designer die Properties der BindingSources an.

    Die zusammengesetzten Strings kannst du glaub am einfachsten über berechnete Spalten modellieren.

    sonne75 schrieb:

    Und wenn ich z.B. ID von einem Datensatz habe, wie komme ich an eine andere Column?
    Was willst du mit der Id vom Datensatz?
    Du hast doch den Datensatz.

    vlt. vier Views-Videos nochma gucken, oder Daten laden, speichern, verarbeiten - Code-Samples: Die Id braucht man eiglich nie, man hat immer den ganzen Datensatz.