Primärschlüssel einer Datatable auslesen, wenn Wert in Combobox verändert wird

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von SamuelCooper.

    Primärschlüssel einer Datatable auslesen, wenn Wert in Combobox verändert wird

    Hallo zusammen,

    ich habe nochmal eine typische Anfängerfrage und hoffe, dass mir jemand weiterhelfen kann. Über die Suchfunktion und Google bin ich nicht weitergekommen.

    Ich habe eine Datatable im Dataset, welche mit Daten aus einer xml-Datei befüllt wird. Die dt enthält eine Spalte ID, in welcher die Primärschlüssel der Daten enthalten sind. Die Primärschlüssel werden ebenfalls aus der xml-Datei übernommen, sodass jeder wert immer einen festgelegten, bekannten Primärschlüssel besitzt.
    Die Spalte "Name" der DT habe ich an eine Combobox angebunden, sodass man darüber einen Namen auswählen kann.

    Nun zur Frage:
    Ich möchte nun gerne über ein combobox_SelectedIndexChanged-Sub den Primärschlüssel des Namens auslesen, welcher gerade angewählt wurde.

    Ich habe irgendwo gelesen, man müsste das mit einer "for each" schleife und .select machen, jedoch komme ich dabei nicht weiter:

    VB.NET-Quellcode

    1. private sub cmbbox1_(sender As Object, e As EventArgs) Handles cmbbox1.SelectedIndexChanged
    2. dim dblID as double
    3. for each row in myDs.myDt.select("hier müsste jetzt irgendwas rein")
    4. dbID = row("ID")
    5. next
    6. end sub


    aber geht es nicht auch einfacher, als direkt ein array auszulesen, welches durchsucht wird? Ich mein, ein Primörschlüssel ist ja gerade dazu da, Daten eindeutig erkennbar zu machen.

    Ich vermute, dass ich entweder voll auf dem falschen Weg bin und dass ich die datatable.Select-Methode noch nicht so ganz verstanden habe.

    Wenn es zu meinem Problem bereits einen Thread gibt, freue ich mich auch über einen/mehrere Links. Vllt hab ich einfach nur falsch gesucht.

    Gruß,
    Samuel
    Gib doch deine DataTable als DataSource an die ComboBox und nimm als DisplayMember den Namen und als ValueMember die ID.

    ComboBox.DataSource = myDt
    ComboBox.DisplayMember = "Name"
    ComboBox.ValueMember = "ID"

    Brauchst du im ChangedEvent der ComboBox die ID des Namens, kriegst du die mit

    ComboBox.SelectedValue.ToString()

    Da brauchst du nicht mit irgend welchen Schleifen rum hantieren.
    "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
    Vielen Dank mrMo.
    Das hat so funktioniert und ich finde es auch wesentlich sauberer als mit den Schleifen.
    Eine kurze Frage noch zum Verständnis:
    Das heißt, dass Combobox.selectedValue nur ein Ergebnis liefert, wenn ich die combobox.valuemember-Methode vorher definiert habe? Valuemember ordnet damit quasi dem displaymember den Primärschlüssel zu?
    Außerhalb einer DB oder ähnlichem würde ich nicht von Primärschlüssel sprechen, da dieser nicht zwingend auch die ID des Objekts (z.B. Adresse) darstellt. Nenn es doch einfach z.B. AdressID ;)

    Zu deiner Frage: Probiere es doch einfach aus :)
    "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

    SamuelCooper schrieb:

    Eine kurze Frage noch zum Verständnis:
    Das heißt, dass Combobox.selectedValue nur ein Ergebnis liefert, wenn ich die combobox.valuemember-Methode vorher definiert habe?
    Kurze Antwort:
    Ja, genau. Sinn und Funktion von Combo.ValueMember und .SelectedValue richtig erfasst :thumbup:

    SamuelCooper schrieb:

    Valuemember ordnet damit quasi dem displaymember den Primärschlüssel zu?
    Das nun wieder nicht ganz richtig.
    Gebunden ist die Combo ja an Datensätze, und die haben vielerlei Properties - meist wesentlich mehr als nur zwei. Und die Combobox weiß natürlich nicht, welche davon anzuzeigen ist (display), und welche Property als Fremdschlüssel auf andere Datensätze verweisen mag - das muss ihr mitgeteilt werden.
    Die Property zum Anzeigen wird der Combo als .DisplayMember mitgeteilt, und die "Schlüssel-Property" wird ihr als .ValueMember mitgeteilt.
    Gleiches Prinzip (ein Member wird mitgeteilt), mit unterschiedlicher Auswirkung:
    Der DisplayMember wird gedisplayed, während der Valuemember halt in .SelectedValue zum Tragen kommt.

    Und ich würde auch recht bedenkenlos von Schlüsselspalten, IDs, Prim/Foreign-Keys sprechen - wenns denn zutrifft.
    Relationale Beziehungen bestehen ja mitnichten nur in relationalen Datenbanken.
    Sondern sie bestehen ebenso etwa im Dataset, oder auch in anderen Datenmodellen.
    Viele relationale Beziehungen bestehen tatsächlich sogar in der Wirklichkeit, von der ein relationales Datenmodell ja nur das Abbild ist (das ist ja die Bedeutung des Begriffs "DatenModell").
    ZB ein Mietvertrag ist quasi ein Datensatz, der mittels bestimmter Kenndaten ("Fremdschlüssel") eine Wohnung einer Person zuordnet, odr?

    ErfinderDesRades schrieb:

    Der DisplayMember wird gedisplayed, während der Valuemember halt in .SelectedValue zum Tragen kommt.
    Und in der Value Property das Objekt gespeichert ist, welches die aktuelle Zeile repräsentiert.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Ähm - eine Value-Property gibt's garnet.
    Allenfalls .SelectedValue, aber das speichert kein Objekt, sondern nur einen Wert des selektierten Datensatz - vorzugsweise den Primkey-Wert.
    Der Datensatz selbst findet sich glaub als .SelectedItem, aber ganz sicher bin ich nicht, weil ich geh eh anners vor, ich rufe den selektierten Datensatz immer von der angebundenen BindingSource ab, und fummel möglichst wenig an Controls herum.
    Ok da hab ich mich dann sehr vertan. Sry und Danke an EDR für die Korrektur ;D
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Vielen Dank für die Erklärungen. Ja, ich sehe es auch so, dass man hier auch von ID's und Primärschlüsseln sprechen kann. Meine DT ist meine Datenbank. Sie ist zwar statisch, aber das ist ja egal. Die Spalte "ID" ist auch so definiert und ich benötige eine eindeutige Zuordnung, um Relationen zu erhalten.

    ErfinderDesRades schrieb:

    Der Datensatz selbst findet sich glaub als .SelectedItem

    Das kann ich wiederum bestätigen ;)

    Langsam komme ich jetzt in die funktionsweise von Datatables im Dataset rein und finde allmählich raus, wie ich die Daten darin auch sinnvoll verarbeiten kann.
    @ErfinderDesRades: Ich teile deine Ansicht, dass man nicht für alles eine komplexe Datenbank benötigt. Einfach reicht oft auch und Datatables sind für statische Datenbanken ideal!