wie bekomme ich bei einem Usercontrol mit Databinding die Werte ins Formular zurückgegeben ?

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

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

    wie bekomme ich bei einem Usercontrol mit Databinding die Werte ins Formular zurückgegeben ?

    Ich habe ein Usercontrol das per Databinding mit dem Formular verbunden ist.
    Auf dem Formular liegt eine Bindingsource zu einer Datatble in die die veränderten Daten zurückgeschrieben werden sollen.
    Die Übergabe der Daten an das Usercontrol funktioniert sauber.
    Aber wie bekomme ich die veränderten Daten aus dem Usercontrol wieder zurück ?

    INotifyPropertyChanged habe ich versucht zu implementieren, habe aber leider kein Beispiel gefunden, wo ich sehen kann wie es richtig gehandhabt wird.
    Ich komm nicht ganz mit den gegebenen Infos klar. "ein Usercontrol das per Databinding mit dem Formular verbunden ist." Den Satz versteh ich leider nicht bzw. kann mir nicht vorstellen, was damit gemeint ist. Daher umgeh ich den mal und fange an mit:
    In Deinem UC befindet sich irgendein datenaufnehmendes CE, wahrscheinlich ein DGV. Bei diesem DGV lässt sich doch festlegen, dass die DataSource die Datatable aus dem Hauptformular ist. Und das führt dazu, dass sämtliche Änderungen, die im DGV gemacht werden, erstmal in die DataSource (= Hauptformular-Datatable) übernommen werden. Die endgültige Entscheidung fällt natürlich erst, wenn dann noch AcceptChanges() oder RejectChanges() aufgerufen wird, aber das ist ja erstmal sekundär.
    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.
    Genau genommen sind es 2 Comboboxen, die über Bindingsource aus 2 verschiedenen Tabellen gespeist werden.
    Die IDs übergebe ich folgendermaßen.

    VB.NET-Quellcode

    1. Private _ID_Anschluss As Integer
    2. Public Property ID_Anschluss() As Integer
    3. Get
    4. Return CInt(Me.cboAnschluss.SelectedValue)
    5. End Get
    6. Set(ByVal value As Integer)
    7. _ID_Anschluss = value
    8. Me.bsAnschluss.Position = Me.bsAnschluss.Find(rechnerliste.tbl_Anschluss.ID_AnschlussColumn.ColumnName, value)
    9. dtrowAnschluss = DirectCast(DirectCast(Me.bsAnschluss.Current, DataRowView).Row, dsRechnerliste_be.tbl_AnschlussRow)
    10. End Set
    11. End Property


    Die Property ID_Apl sieht ähnlich aus.

    Das usercontol ist wie im Bild unten gebunden.



    Wie gesagt das Usercontrol zeigt die Daten korrekt an, aber im Hauptformular kommen die Änderungen nicht an.
    Bilder
    • BindingUCT.jpg

      18,63 kB, 314×240, 160 mal angesehen
    Bevor ich versuche, das jetzt alles nachzubauen: In Deinem Propertysetter legst Du die konkrete BindingSourcePosition fest und lässt Dir dann die passende DataRow geben. Und was passiert dann damit? Machst Du dann noch was Relevantes mit der DataRow dtrowAnschluss? Das scheint mir erstmal zu fehlen. Hab zwar noch nicht geschaut, ob Änderungen in dtrow auch was in der dahinterliegenden DataTable ändern, aber das kannst Du mit passendem Testcode (im Sinne von: "Mit folgenden muss sich auf jeden Fall was ändern") schneller rausfinden.
    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.
    Das datarow wird nur zum Auslesen der Werte verwendet, also keine Schreibzugriffe.

    Verstehe ich Deinen Post richtig, das die gebundenen IDs ohne zusätzlichen Eingriff zurückkomen müßten ?

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

    Ja, so meint ich das.

    Ich hab versucht, Deine UC-Struktur nachzubauen. Was ich testweise mal gemacht habe:

    VB.NET-Quellcode

    1. <System.ComponentModel.Bindable(True)>
    2. Public Property ID_Anschluss As Integer = 0

    Ohne Getter, ohne Setter. Die ComboBox im UC verändert nur diese Property.
    Habe weiterhin ein DataSet und eine BindingSource auf eine dortige DataRow innerhalb einer dortigen DataTable (DataSet1 -> DataTable "Telefonanschluss" -> DataRow Typ Integer "Anschlussnummer".
    Binde ich in der Hauptform mittels BindingSource diese DataRow an die UC-Property "ID-Anschluss", wird nach Programmstart und Hinzufügen einer passenden DataRow in der DataTable des DataSets der korrekte Wert im UC übernommen. Löse ich die ID-Anschluss-Änderungsprozedur mittels der UC-ComboBox, wird (natürlich) ID-Anschluss verändert, aber eben auch der Eintrag im DataSet.

    Also funktioniert es grundsätzlich.
    Es stellt sich für mich einmal die Frage, ob Dein Setter in seiner jetzigen Form sein muss, zum anderen frag ich mich, warum da steht: "me.bsAnschluss". Wo befindet sich die BindingSource? Im UC? Denn wenn ja, kann es durchaus sein, dass Du 2 BindingSources pro Property hast. Eine im UC und eine im Hauptformular. Und dann wird's Mus. Denn dann sind auch 2 DataSets da, die unterschiedliche aktuelle Daten haben. Da sind wir schnell bei tricky ErfinderDesRades-Themen zum Thema Umstöpseln oder wie bekommen mehrere Formen dieselben Daten.
    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.

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

    Es sind 3 Bindingsource, bsAnschluss beinhaltet die Dosen und enthält die ID_Anschluss, bsArbeitsplatz beinhaltet die Arbeitsplätze (Schreibtische) mit der ID_Apl und bsRufnr mit der ID_Rufnr als Primärschlüssel steuert das Ganze (beide Schlüssel sind auch in der bsRufnr enthalten.

    Die Bindingsourcen werden an eine Instanz des Dastasets umgehängt, die Daten existieren physisch nur einmal.

    VB.NET-Quellcode

    1. Dim Rechnerliste As dsRechnerliste_be = dsRechnerliste_be.GetInstance
    2. Me.bsArbeitsplatz.DataSource = rechnerliste
    3. Me.bsAnschluss.DataSource = rechnerliste
    4. me.bsRufnr.Datasource=rechnerliste


    Den Setter benötige ich definitv bei der ID_Apl, da aus diesem die Auflistung der möglichen AnschlussDosen zusammengestellt wird. Dummerweise kann ein Raum 2 Raumbezeichnungen (Türen) haben.Ob es hier eventuell ein zweckmäßigeres Datenmodell gebe, läßt sich drüber streiten, es läuft aber unter VBA und VB6 seit Jahren in mehreren Anwendungen, so das Änderungen kritisch sind.
    Ich hatte das UC jetzt mal so umgestrickt, das ich nicht die einzelnen IDs übergebe, sondern die bsRufnr, er erkennt im UC die Änderung des aktuellen Datensatzes, ändert aber spannendwerweise nicht die daran gebundenen Comboboxen.Auch die Rückübertragung funktioniert nicht, Ich habe zur Kontrolle 2 Comboboxen im Formular (nur während der Testpahase), die an die selben IDs gebunden sind.

    Habe weiterhin ein DataSet und eine BindingSource auf eine dortige DataRow innerhalb einer dortigen DataTable (DataSet1 -> DataTable "Telefonanschluss" -> DataRow Typ Integer "Anschlussnummer".Binde ich in der Hauptform mittels BindingSource diese DataRow an die UC-Property "ID-Anschluss", wird nach Programmstart und Hinzufügen einer passenden DataRow in der DataTable des DataSets der korrekte Wert im UC übernommen. Löse ich die ID-Anschluss-Änderungsprozedur mittels der UC-ComboBox, wird (natürlich) ID-Anschluss verändert, aber eben auch der Eintrag im DataSet.

    Wo hast Du das Dateset und die Datarow untergebracht im Formular oder im UC und wie löst Du die Änderungsprozedur aus ? Ich halte es für wahrscheinlich das der Schritt bei mir fehlt.
    DataSet (und somit auch DataRow) liegen auf der Hauptform. Dort binde ich auch das UC an die DataRow (ich poste gleich noch nen Screenshot als Edit dieses Posts). Die Änderungsprozedur innerhalb des UC ist eine einfache ComboBox_SelectedIndexChanged-Geschichte, die direkt nur Auswirkung auf AnschlussID hat. Aber da AnschlussID mit der DataRow des DataSets gekoppelt/verbunden ist, wird dann auch die DataRow geändert.

    EDIT: Und gleich noch mein Testprojekt dazu
    Screenshot 1: Mein rudimentäres DataSet
    Screenshot 2: die Bindung der DataRow an das UC. ACHTUNG: Die auf der Hauptform verwendete BindingSource verweist direkt an die DataRow (TelefonAnschluss->Anschlussnummer)!
    Bilder
    • DataSet.png

      14,01 kB, 460×423, 166 mal angesehen
    • UC - BS.png

      44,41 kB, 1.388×716, 158 mal angesehen
    Dateien
    • WindowsApp1.zip

      (63,43 kB, 154 mal heruntergeladen, zuletzt: )
    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.

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

    Die Abfrage über die IDs klappt tatsächlich. Ich hatte mir zur Kontrolle Comboboxen auf das Formular gezaubert, bei denen ich eine Änderung der Werte erwartet hätte.
    Das ging aber nicht automatisch.
    Erst als ich mit einem zusätzlichen Button (nennen wir ihn mal speichern) diesen Combox.Selectedvalue die Selectedvalue zugewiesen habe, hats geklappt.
    Da habe ich mich von der fehlenden Aktualisierung der Comboboxen kirre machen lassen, im Dataset standen die richtigen Werte.

    Danke für Deine Hilfe, das habe ich durch Dein Beispielprojekt und darauf aufbauend eigene Versuche rausbekommen.