DataSet, Beziehung mittels ComboBox Herstellen

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

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

    DataSet, Beziehung mittels ComboBox Herstellen

    Servus Zusammen,

    ich habe (nach langer zeiter der Fehlersuche) endlich geschafft ein DataSet einzubinden. Diese Befülle ich auch mit Daten. Jetzt ist es nur so, das ich bei den Daten den dazugehörigen Großhändler hinterlegen will. Die Großhändler habe ich in einer extra Tabelle welche eine Relation zu der Einkauftabelle hat. Nur wie kann ich jetzt diese miteinander verbinden per Code?



    Die ID des Großhandels ist mit der Spalte GroßhandelsID verknüpft.

    Den Großhändler trage ich mittels einer Textbox in die die DataTable "Großhändler" ein.

    Diese lasse ich mir über eine ComboBox dann anzeigen.

    Wie kann ich jetzt, wenn in der ComboBox der Wert "Großhändler1" die ID für diesen hinterlegen? er will nämlich eine ColumnSpalte haben...


    sorry, ich weiß, das es eig. eine leichte Frage ist, nur ich bin da schon leider sehr lange raus aus dem Thema gewesen.
    Die Tabelle Großhändler enthält ne Zeile namens Großhändler? Ich seh die Verwirrung jetzt schon: If Einkauf.First.GroßhändlerRow.Großhändler = Großhändler.First.Großhändler Then … (vielleicht nicht praxisnah, aber vom Prizip her)). Spekulatius-Gegenvorschlag für die Zeilenbenennung: Name
    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 mir jetzt nochmal deine vier Views Videos angeschaut (die kannte ich davor schon, hiermals danke nochmal, die haben mir recht gut geholfen, in das Thema zurück zu finden). Leider war das was ich gebraucht habe, nicht im Video.

    VB.NET-Quellcode

    1. For Each lines In System.IO.File.ReadAllLines(OpenFile.Text)
    2. Dim line() = lines.Split(";")
    3. DataSet1.Einkauf.AddEinkaufRow(line(0), line(1), line(2), line(3), line(4), line(6), line(7), line(8), line(9), line(10), line(11), line(12), line(13), line(14), line(15), line(16), "", "", "", "", "", "", line(5), ComboBox1.SelectedItem)
    4. Next


    Der gezeigte Code, ist der Code, wie ich meine Daten momentan verarbeite. Ich bekomme die Daten in einer CSV Datei, welche ich einlesen will. Jetzt habe ich nur mehrere Händler. Es muss dort, wo noch gerade "ComboBox1.SelectedItem" steht, die ID vom Händler eingetragen werden per Code.

    Ich will nämlich später, dass das Programm alle Dateien eigenständig herunterlädt (dafür habe ich eine feste URL) diese Einliest, im DataSet die neuen Werte einträgt bzw. die alten Werte aktualisiert, obwohl ich nicht weiß, ob es evtl. einfacher ist zu sagen, dass er vor dem Einlesen der Daten vom Händler A, den Artikelsatz von dem Händler A löscht, und die Daten kompletten Daten wieder neu einließt, damit auch evtl. entfallene Produkte raus gestrichen werden .
    lines.Split(";")? Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort Option Strict On.
    Eine DataSet.Add…Row-Prozedur (bei Dir also DataSet1.Einkauf.AddEinkaufRow) will bei korrekter DataTable-Bindung/Kopplung keine blanke ID, sondern eine Row, also in dem Fall eine GroßhändlerRow. Eine pure ID zu verwenden ist zwar bei falscher/nicht vorhandener Kopplung möglich, aber die ergibt sich nicht aus einem ComboBox1.SelectedItem - es sei denn, da stehen blanke IDs in Form von Integern drin. Was auch nie sein dürfte. Denn welcher User will sich mit internen IDs rumschlagen?
    Daher gehe ich davon aus, dass in der ComboBox die GroßhändlerRows drin sind bzw. die ComboBox die Großhändler-Table abgebildet wird. Das führt aber dazu, dass Du eine GroßhändlerBindingSource auf Deinem Form haben müsstest. Und das heißt, dass Du bei dem Aufruf von DataSet1.Einkauf.AddEinkaufRow als letzten Parameter keine ID eintragen musst, sondern das doppelgecastete GroßhändlerBindingSource.Current. Mach mal ne foreninterne Suche nach Doppelcast, dann weißt Du, wie aus dem GroßhändlerBindingSource.Current eine GroßhändlerRow wird.
    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 mir das DirectCast angeschaut. Soweit ist es eine verbesserung von CType, oder etwa nicht?

    Und ja komischerweise war Option Strict aus, obwohl ich es standardgemäß aktiviert hatte. Kann vllt. daran liegen, das ich es sher oft installiert und deinstalliert hatte und ich es dann vergessen hatte. Danke für den Hinweise.

    aber zu DirectCast. Wieso muss ich es zweimal aufrufen und kann es nicht direct als GroßhändlerRow konvertieren?
    Sprich so:

    VB.NET-Quellcode

    1. DirectCast(GroßhändlerBindingSource.Current, DataSet1.GroßhändlerRow)


    Das ist das einzige, was ich nicht genau verstehe. ich ruf da ja auch das Bindingsource auf, und sage direkt, das er es in ein GroßhändlerRow konvertieren soll


    ________________________EDIT______________________

    okay gut, anscheinend kommt er damit nicht klar, sobald ich den Inhalt der Cbtb ändere, da hängt er sich jetzt irgendwie immer auf. Aber wenn ich keinen anderen auswähle, sprich den beim Start vorgegebenen lasse,dann funktioniert es

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

    Nun, die BindingSource enthält keine Liste von DataRows, sondern von DataRowViews. Und ein DataRowView enthält eine DataRow. Daher erfolgt der Cast von Object zu DataRowView, dann nimmt man davon die Row und castet sie zur typisierten DataRow. Gegenbeispiel Computerregal im Shop: Es sind ganz viele Computer nebeneinander, aber was Dich interessiert, sind die CPUs. Daher kannst Du nicht Regalobjekt als eine CPU verstehen, da es keine CPU ist, sondern die CPU nur ein Teil des Regalobjekts.
    Daher
    1. Cast von GroßhändlerBindingSource.Current in DataRowView
    2. von diesem DataRowView nimmst Du die Row
    3. Cast der Row in Deine typisierte DataTable-Row = das, was Du wirklich haben willst
    Bezüglich CType - DirectCast: DirectCast ist eine sehr spezifische Umwandlung, die scheitert, wo CType noch was hinbekommt. Allerdings verwende ich bisher nur DirectCast, weil meine Umwandlungen immer sehr spezifisch sind. Von einem allgemeinen Typen zu einen spezifischeren Typen. Aber immer mit der Prämisse, dass ich nicht versuche einen Stein in einen Atomreaktor zu verwandeln.
    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.