ComboBox -> aus zwei Tabellen

  • VB.NET
  • .NET 4.5

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

    ComboBox -> aus zwei Tabellen

    Hallo Gemeinde.

    Verzweifel hier noch .....

    Eine ComboBox Daten aus einer Tabelle befüllen - kein Problem, aber aus zwei Tabellen. Schlimm. ^^
    So, in der Hoffnung, ich schreibe jetzt alles hin, damit kein Detail fehlt.

    Folgende Tabellen habe ich:


    mit folgendem Inhalt (Ausschnitt):




    Beim Anlegen eines Kunden, wird das Kraftfahrzeug (momentan nur Pkw´s) mit dem amtlichen Kennzeichen (Amtsdeutsch: Unterscheidungszeichen) erfasst.


    Die ComboBox beinhaltet die Kurzform einer Stadt/eines Landkreises KFZ_UNTERSCHEIDUNGSZEICHEN.usz_short. Hier wiederum die Sonderkennzeichen KFZ_UNTERSCHEIDUNGSZEICHEN.bundeslaender_id <> 1 nicht ausgegeben werden.
    Daneben der Rest vom Kennzeichen (ist hier momentan egal).
    Ganz außen rechts eine Textbox (Multiline) soll KFZ_UNTERSCHEIDUNGSZEICHEN.usz_long und KFZ_BUNDESLÄNDER.bundesland

    Wie bin vorgegangen?

    Danach habe ich das Datenbankmodell "DataSet" und die bestehende Datenbankverbindung ausgewählt.
    Folgend die Auswahl der beiden Tabellen KFZ_UNTERSCHEIDUNGSZEICHEN und KFZ_BUNDESLÄNDER und DataSet-Name "KFZKennzeichen".

    Am Ende sieht das wie folgt aus (Databinding)


    Bei "Asugewählter Wert":


    Wie weiter? ?( ?(


    Habe schon öfters von @ErfinderDesRades gelesen, dass man gebundene ComboBoxes (Controls) nicht direkt ausliest.
    Wie macht man das dann?
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    Da Du dazu tendierst, keine vollständigen Sätze zu schreiben, fällt es mir etwas schwer, Dir zu folgen. Du hast eine ComboBox. Und aus welchen 2 Tabellen willst Du jetzt was machen? Aus welcher Tabellenauswahl (gib mal bitte 2-3 Beispiele, was man auswählen kann) wählst Du einen Wert aus? Und wo soll dann was aus welcher 2. Tabelle stehen? => zu den Beispielen bitte die Werte aus Tabelle 2.

    ##########

    Eine Runde Mittagsschlaf in der Sonne später: In der ComboBox soll also ein Kürzel ausgewählt werden, z.B. S, B, DD, BGL. Und in der MultiLine-TextBox soll dann der Landkreis und das dazugehörige Bundesland stehen (Stuttgart, BaWü; Berlin, Berlin, Dresden, Sachsen; Berchtesgadener Land, Bayern). Ok. Dazu musst Du aber nix in der ComboBox weiter machen, sondern in der TextBox. Falls es denn eine sein muss. Denn mit nem DGV wärst Du auf der richtigen Schiene, wenn Du es nur durch DataBinding, aber ohne eigenen Code schaffen willst. Ins DGV kommen 2 ComboBox-Spalten, die die jeweilige Datenquelle hernehmen und dann aus der BindingSource ihre ValueMember nehmen. Ich bastel mal.
    Mit ner TextBox wärest Du im BindingSource_CurrentChanged-EventHandler gut aufgehoben.



    Code für die TextBox (optional):

    VB.NET-Quellcode

    1. Private Sub KFZ_UNTERSCHEIDUNGSZEICHENBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles KFZ_UNTERSCHEIDUNGSZEICHENBindingSource.CurrentChanged
    2. Dim CurrentRow = DirectCast(DirectCast(KFZ_UNTERSCHEIDUNGSZEICHENBindingSource.Current, DataRowView).Row, Tds.KFZ_UNTERSCHEIDUNGSZEICHENRow)
    3. TextBox1.Text = CurrentRow.usz_long & Environment.NewLine & CurrentRow.KFZ_BUNDESLÄNDERRow.bundesland
    4. End Sub


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VaporiZed“ ()

    Servus.

    Oh, wirklich? Versuche mich zu bessern, klare und aussagekräftige Sätze zu schreiben. ;)
    Dachte, ich hätte das sehr ausführlich geschrieben. ^^

    Aber der inhaltliche Aspekt kam zumindest rüber. Stunde Schlaf bringt schon was, gell? ^^

    Sauber Arbeit.

    Leider ein ABER ...
    Würde eher die Textbox bevorzugen (Stadt/Landkreis).

    Code für die Textbox ist klar:
    Hier soll, sobald in der ComboBox der Eintrag geändert wird, der Inhalt der Textbox ändern. Klar.
    Aber was nimmst dafür her, um an das Bundesland zu kommen? Geht ja nur die bundeslaender_id .... Aber wie? Das verstehe ich leider nicht.

    Vor allem auch das:

    C#-Quellcode

    1. ​Tds.KFZ_UNTERSCHEIDUNGSZEICHENRow


    War der Meinung, dass schon in der ComboBox eine Verknüpfung zur KFZ_BUNDESLÄNDER hergestellt werden kann, sodass man später mit dieser das Bundesland auslesen kann.
    vb-paradise.de/index.php/Attac…fcfcdbab0bd0b62ab0d457a28
    vb-paradise.de/index.php/Attac…fcfcdbab0bd0b62ab0d457a28
    Das sind die Bilder aus dem Ausgangspost.

    Hm ...
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

    JackCimberly schrieb:

    was nimmst dafür her, um an das Bundesland zu kommen? Geht ja nur die bundeslaender_id .... Aber wie?
    Indem ein CE wie eine weitere ComboBox als Datenquelle die Bundeligalandtabelle hernimmt und die aktuelle bundeslaender_id hernimmt, um den aktuellen Tabelleneintrag zu ermitteln.
    Ich muss zugeben, ich weiß nicht, was man alles mit dem SelectedValue/"ausgewählten Wert" der ComboBox alles so machen kann, aber m.E. wird der v.a. dazu hergenommen, von einem anderen CE bzw. einer anderen Quelle her festzulegen, welcher Wert in der ComboBox selektiert ist.
    D.h., wenn eine 2. ComboBox über eine BindingSource den bei der 1. ComboBox bei "Ausgewählter Wert" entsprechenden Wert ändert, reagiert die 1. ComboBox, indem jener Index ausgewählt wird, der in der ListBox ausgewählt wurde. Es ist also m.E. dafür da, den ausgewählten ComboBoxeintrag festzulegen, anstatt mit dem ausgewählten ComboBox-Wert etwas zu beeinflussen.

    btw: "Vor allem auch das: Tds.KFZ_UNTERSCHEIDUNGSZEICHENRow" - Tds ist der Name meines typisierten DataSet. Das andere ist ein konkreter Zeilentyp.
    Und das mit DirectCast(DirectCast(KFZ_UNTERSCHEIDUNGSZEICHENBindingSource.Current, DataRowView).Row, Tds.KFZ_UNTERSCHEIDUNGSZEICHENRow) hast Du doch bestimmt schonmal beim ErfinderDesRades gesehen. Das gibt die konkret ausgewählte DataTable-Zeile der entsprechenden BindingSource wieder. Also quasi der ausgewählte Tabelleneintrag. Wodurch auch immer jener ausgewählt wurde.

    Machen wir es mal so rum: Was funktioniert denn noch nicht so, wie Du dachtest? Den TextBox-Code hast Du ja.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“ ()

    Ich muss das erstmal sacken lassen und probieren.
    Aber geht so ähnlich wie bei Access. Soweit habe ich das schon verstanden - so in diese Richtung wollte ich es umsetzen. Nur habe ich nicht an eine zweite ComboBox gedacht, stattdessen an eine Textbox.
    Aus diesem Grund war ich anfangs irritiert, dass in der 1. ComboBox keine zweite Tabelle eingebunden werden muss.

    Ja, solch eine Art Video habe ich schon gesehen.

    Ab Minute 7:34 wird es interessant.

    Typisierten DataSet:
    Ich habe in meinem Projekt-Explorer drei .xsd (also DataSets).

    C#-Quellcode

    1. Tds.KFZ_UNTERSCHEIDUNGSZEICHENRow

    Rot unterkringelt.


    Im Video schaut das ein wenig anders aus, da hat @ErfinderDesRades so eine Art Reiter mit TDs. Hm ... finde das nicht bei mir. ^^
    Tante Edit: Meine Herren - eingeblendet muss ja mal werden, dann klappt das auch. ^^

    Auf jeden Fall erst mal Danke bis hierin ... ;)

    Wie geschrieben, ich schau mir das noch mal genauer an, wenn auch Videos von @ErfinderDesRades.

    Werde Rückmeldung geben.


    ########################

    das tds ... was im Code rot unterkringelt war, habe ich jetzt behoben.Ich hatte schon ein TDs names KFZKennzeichen angelegt gehabt, mit den beiden Tabellen (KFZ_BUNDESLÄNDER und KFZ_UNTERSCHEIDUNGSZEICHEN), die mittels bundeslaender_id miteinander verknüpft sind.



    Scheint zu funktionieren.

    :thumbsup: :thumbsup:
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „JackCimberly“ ()

    Hallo Gemeinde.

    Jetzt habe ich genau das Problem mit dem beiden ComboBoxen (wie in Post 4 angesprochen).
    Erst soll die Automarke (cboAutomarken) gewählt werden, dann erst werden die zur Automarke gehörenden Automodelle (cboAutomodelle) angezeigt.


    Folgendes habe ich:
    ComboBoxen: cboAutomarken und cboAutomodelle
    T.DataSets: AutoMarke und AutoModelle
    Tabellen: FAHRZEUGE_MARKEN und FAHRZEUGE_MODELLE (war mühsam, diese Tabellen mit Daten zu bestücken) (siehe Anhang als .xlsx-Format)
    Hier besteht eine 1:n Verbindung zwischen FAHRZEUGE_MARKEN.fz_marken_id und FAHRZEUGE_MODELLE.fz_marken_id

    DataBinding der ComboBoxen cboAutomarken und cboAutomodelle.

    cboAutomarke


    cboAutomodell


    cboAutomarken liefert die Automarken. Wählt man beispielsweise BMW, werden alle Automodelle in cboAutoModelle angezeigt, aber springt zum Modell 4C (960). Das ist falsch.
    1. Sollten nur die zur Automarke gehörenden Modelle angezeigt werden und
    2. ist der Sprung zum Modell auch falsch, da (tbl FAHRZEUGE_MODELLE, fz_modelle_id = 8, fz_marken_id = 2; tbl FAHRZEUGE_MARKEN, fz_marken_id = 8 = BMW). Also wurde FAHRZEUGE_MODELLE.fz_modelle_id hergenommen.

    Habe leider auch nicht wirklich eine vernünftige Aufklärung gesehen - gut, das Video von @ErfinderDesRades, aber hab´s da nicht gut verstanden. Dort ist das andersrum.
    Habt Ihr gute Videos (wenn es geht in deutscher Sprache), die erklären, was DataSets können (klar, speichern, laden, etc.). Meinte eher die Möglichkeiten.

    Hm .... da stehe ich wieder da. ^^

    PS zu @VaporiZed grins ... Sätze sind jetzt verständlich geschrieben, gell? ;) ;)
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

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

    Die Zeile "Ausgewählter Wert" in der ComboBox ist dafür nicht geeignet. Da kann man quasi festlegen, welcher Listenindex ausgewählt wird. Aber die Daten bleiben gleich. Wenn Du Dir das Datenquellenfenster anschaust, hast Du bei Deinem tDS 2 Tabellen: FAHRZEUGE_MARKEN und FAHRZEUGE_MODELLE.
    Aber: Wenn Du bei dem einen, nämlich FAHRZEUGE_MARKEN links auf das (>) gehst, kommt nicht nur die Auflistung der Tabellenspalten, sondern auch eine weitere DataTable. "Wie jetzt? Nochmal FAHRZEUGE_MODELLE?" Ja, und genau die brauchst Du jetzt. Da werden dann nämlich, wenn Du das Teil auf Dein Form ziehst, nur diejenigen Modelle im erscheinenden DGV zur Laufzeit angezeigt, die zur ausgewählten Marke passen. Das DGV kannst Du auch löschen. Die übrigbleibende BindingSource ist dann noch übrig, die Du nutzen kannst, da sie schon so eingestellt ist, dass ihre Datenquelle nicht direkt das tDS ist, sondern eine andere BindingSource ist, sodass diese Abhängigkeit darin widergespiegelt wird.

    ##########

    Deine Sätze waren mir nun klar. Allerdings sind die Tabellen in gutem Zustand. Wo war das Einleseproblem?

    ##########

    Der DetailView von EdRs VVV wäre auch ein passendes Video gewesen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    Sorry für den Doppel-Post.

    Mithilfe des Videos, konnte ich das Problem lösen:


    Habe die ComboBoxen und die angelegten DataSets gelöscht.

    Im Reiter Datenquellen habe ich eine neues DataSet namens AutoMarkenModelleDataSet (tbl FAHRZEUGE_MODELLE und tbl FAHRZEUGE_MARKEN) angelegt.
    Danach habe ich eine ComboBox auf die Form gezogen. Danach habe ich via Drag&Drop aus Datenquellen FAHRZEUGE_MARKEN auf die ComboBox gezogen.
    Folgend habe ich bei Datenquellen via Rechtsklick auf FAHRZEUG_MODELLE 'ComboBox' ausgewählt/aktiviert.


    Dann FAHRZEUG_MODELLE auf die Form gezogen.

    Und mein Problem wurde hierdurch behoben. ;)

    Tante Edit - Ergebnis:
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

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