Listbox mit Mehrfachselektion in DB schreiben

  • VB.NET

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

    Listbox mit Mehrfachselektion in DB schreiben

    Hallo,

    ich habe - wieder einmal - ein kleines Problem.

    Ich habe eine Listbox, die über eine Bindingsource an ein Dataset gebunden ist, ohne viel Federlesens mit dem Designer erstellt. Dazu gehört noch ein DGV, das an derselben Bindingsource hängt, also alles nichts Besonderes.

    Die Listbox wird gefüllt durch Bindung an eine Bindingsource. Das klappt auch alles, die Werte werden korrekt angezeigt.

    Jetzt kommt mein Problem:

    Wenn ich einen Eintrag in der Listbox selektiere, wird die ID dieses Eintrags korrekt in die DB geschrieben.

    Setze ich die Listbox - so möchte ich es eigentlich haben - auf Multiselect - und selektiere mehr als einen Eintrag in der Listbox, wird aber nur die jeweils niedrigste ID in die DB geschrieben.

    Mir ist schon klar, dass ich mit listbox.selectedValue bzw. listbox.selectedItems an die ID bzw. den Wert der selektierten Werte rankomme, aber mir fehlt der Zwischenschritt, wie ich das dann über ein normales Tableadapter.Update in die DB schreiben kann. Bei nur einem selektierten Wert geht das offensichtlich automatisch, aber bei mehr als einem Wert?

    Danke für jeden Tipp,
    Volkmar
    Nein, eben nicht, ich habe alles mit dem Designer gemacht.

    Das sind die einzige Stückchen Usercode für diesen Teil:

    VB.NET-Quellcode

    1. ​Private Sub Autocomplete()
    2. ' Listbox Vorschläge durch Interviewer ja/nein füllen mit Werten aus Tabelle oa_stelle, Spalte oa_referenznummer
    3. Dim i As Integer
    4. For i = 0 To BewerberduckDataSet.oa_stelle.Rows.Count - 1
    5. 'Stelle_vorschlagen_laut_interviewerListBox.Items.Add(BewerberduckDataSet.oa_stelle.Rows(i)("oa_referenznummer").ToString)
    6. Stelle_nicht_vorschlagen_laut_interviewerListBox.Items.Add(BewerberduckDataSet.oa_stelle.Rows(i)("oa_referenznummer").ToString)
    7. Next
    8. End Sub


    Das vorige steht in Form.Load als Autocomplete()

    Das steht am Ende im Button:

    VB.NET-Quellcode

    1. Private Sub btnNachGespräch_Click(sender As Object, e As EventArgs) Handles btnNachGespräch.Click
    2. Me.Validate()
    3. Me.BewBindingSource2.EndEdit()
    4. Me.BewTableAdapter2.Update(Me.BewerberduckDataSet.bew)
    5. End Sub


    Das erste Codefragment füllt eine Listbox mit korrekt Einträgen aus einer DB-Spalte, nach Klick auf den Button landet aber nichts in der DB.

    Das, was in der DB landet, kommt von einer zweiten Listbox, die nur über den Designer gefunden und gefüllt wird. Da landet nach Klick auf den Button die korrekte ID der Auswahl in der DB, aber immer nur die mit der niedrigsten ID.

    Ich hätte das, was in der Listbox selektiert ist, ganz unelegant in Variablen schreiben und deren Inhalt dann über böses sql etc. in die DB schreiben können, aber das wollte ich gerade nicht.
    hmm.

    Eine Auswahl "landet" doch eh nie in der Db.
    Eine Auswahl ist halt eine Auswahl.
    In der Db können nur Daten-Änderungen landen.
    Also von daher ist mir auch unklar, dass überhaupt was aus deiner 2. Listbox landet.

    Und deren Landung geht auch ganz ohne Code vor sich? Landet es wenigstens in der Tabelle, wo es hin soll?
    sorry für meine schlampige Ausdrucksweise.

    Ich versuche mal, es besser zu machen (wird in Deinen Augen wahrscheinlich auch nicht besser sein, aber ich gebe mir Mühe).

    Ignoriere das erste codefragment. Das gehört zu einer anderen Listbox, mein Fehler. Diese Listbox wird zwar gefüllt wie im Code beschrieben, aber Abspeichern funktioniert nicht.

    Listbox 2 wurde aus einem Dataset im Designer auf die Form gezogen und vorher als Listbox definiert. Danach Klick auf den Auswahlpfeil der Listbox für Databinding, an Daten gebundene Werte angeklickt und die Felder ausgefüllt.

    Die Werte kommen aus einer anderen Tabelle desselben Datasets. Also Listbox aus Tabelle 1 des Datasets1, Auswahlwerte aus Tabelle 2 des Datasets1. Alles über den Designer.

    In Listbox2 wird bei Ausführung korrekt der Member aus Tabelle 2 angezeigt. Wenn ich einen Wert selektiere und per Tableadapter.Update losschicke, landet die ID des selektierten Werts aus Tabelle 2 in der korrekten Spalte, zu der die Listbox2 aus Tabelle 1 gehört.

    Wenn ich die Form schließe und neu starte, wird der zuvor ausgewählte Wert und zur DB geschickte Wert in der Spalte, in der er zuvor abgespeichert wurde, als Member in Listbox2 als selektiert angezeigt. Die ID wird nicht angezeigt, die ID ist aber in der DB in der korrekten Spalte in Tabelle 1.

    Und nein, mehr Code dafür gibt es nicht.
    Jetzt geht es nur noch um Listbox2, richtig?

    Und was du beschreibst, nenne ich einen DetailView mit Joining-Anteil - also ich hab eine umfangreiche Theorie zu den prinzipiellen Präsentationsmöglichkeiten, die bei databinding-getriebenen Anwendungen verfügbar sind.
    guggemol da: vier Views-Videos - sogar mit viele Videos - du merkst ja grad, wie schwer das zu beschreiben ist, was eiglich klick-klick fertig gemacht ist.

    Jedenfalls, bei einem Joiningview ists halt so: Die Auswahl - nur eine! wird in die untergeordnete Tabelle geschrieben.

    Also Beispiel: Du hast Kategorien und Artikel, und einen JoiningView, der die Artikel anzeigt, und halt sone Joining-Listbox, mit der du für den Artikel eine Kategorie auswählen kannst.
    Dabei wird (intern) dann der ForeignKey des Artikels auf die ausgewählte Kategorie gesetzt - und das ist auch die Änderung, die in der Db landet.

    Und natürlich kann man für einen Artikel nur eine Kategorie auswählen - wie sollte man denn mehrere Kategorien da eintragen - ein Artikel hat doch nur einen ForeignKey!

    Guck dir wirklich die Tuts mal an, ist bestimmt auch was nützliches für dich dabei, und sei es, dass "nur" Begrifflichkeiten geklärt werden.
    achso - wenn du es schon kennst, dann kannst du meinen Ausführungen ja bereits folgen.

    Wie gesagt: Wie sollte das denn gehen, wenn die Kategorie-Listbox, mit Mehrfach-Auswahl mehrere Kategorien gleichzeitig demselben armen kleinen Artikel zuordnen wollen würde?

    Ich glaub, du muss mehr von deinem Datenmodell erzählen, weniger von Listboxen - worum geht es da?

    Kannst du vlt. ein Screenshot von deim TypDataset anhängen?



    Jo, und guck dir nochmal den Film zum typisierten Programmieren an.

    Sowas hier geht nicht:

    Volkmar schrieb:

    VB.NET-Quellcode

    1. Stelle_nicht_vorschlagen_laut_interviewerListBox.Items.Add(BewerberduckDataSet.oa_stelle.Rows(i)("oa_referenznummer").ToString)
    Typisiert hiesse es:

    VB.NET-Quellcode

    1. Stelle_nicht_vorschlagen_laut_interviewerListBox.Items.Add(BewerberduckDataSet.oa_stelle(i).oa_referenznummer)
    Und auch das ist noch quatsch, denn in Wirklichkeit kann man die Listbox doch einfach binden, was die ganze Schleife erübrigen würde.