Databinding über mehrere Formen mit gleichem Dataset?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Databinding über mehrere Formen mit gleichem Dataset?

    Hallöchen,

    ich habe Databinding für mich entdeckt und bin sehr zufrieden keine grausigen Speichern/Laden Methoden mehr zu nutzen.

    Nun habe ich ein Dataset dieses sieht so aus:


    Ein Datagridview das so aussieht:


    Nun möchte ich wenn ich auf den Button drücke das sich eine Form öffnet in der ich dann die Episoden bearbeiten kann.
    Problem dabei ist: Wie kann ich denn mit dem gleichen Dataset in der anderen Form arbeiten?
    Muss ich das Dataset vorher mit WriteXml speichern und dann in der neuen Form wieder neu laden in eine neue Instanz?

    Wie würdet ihr das machen?Ich stehe da grad echt auffen Schlauch.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Jup. Ich mach's auch immer so. Eine BindingSource (BS) pro Form, welche als DataSource (DS) den Datencontainer entgegennimmt (also in diesem Fall das tDS), und die anderen BSs des Forms verweisen mit ihrer DS auf die erste BS. So braucht man nur die DS der Haupt-BS pro Form zu setzen und fertig ist das Ganze. Ok, wenn man kein tDS hernimmt, muss man ggf. noch Haupt-BS.ResetBindings() aufrufen, aber sonst recht easy. Ohne Zwischenspeichern in ner XML.
    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.
    ich glaub ich hab im angegebenen Tut auch eine HelpersBibliothek veröffentlicht, mit BingingSource-Extensions drinne, die das alles wegkapseln.
    Da heisst es nurnoch:

    VB.NET-Quellcode

    1. myBindingSource.EditCurrent(Of dlgMyEditDialog)
    und dlgMyEditDialog geht auf, mit dem du den aktuellen Datensatz von myBindingSource editierst.
    Und es heisst:

    VB.NET-Quellcode

    1. myBindingSource.EditNew(Of dlgMyEditDialog)
    und dlgMyEditDialog geht auf, mit dem du einen neuen Datensatz in myBindingSource erstellst und editierst.

    dlgMyEditDialog musste halt selbst entwickeln, und er muss eine passende BindingSource aufweisen, und beim Schliessen DialogResult.Ok oder DialogResult.Cancel returnen (nee, musser nicht, aber wäre doch überaus praktisch).
    Um alles weitere (Bindings des Dialogs umswitchen, ggfs. neuen Datensatz anlegen, ggfs. den EditVorgang canceln) kümmert sich die Extension.
    Hallöchen,

    danke erstmal für all die Antworten.
    Ja das Tut vom @ErfinderDesRades hab ich mir natürlich angeschaut, dachte ich kanns einfach machen ohne HelperBib aber klappte nicht.
    Ich dächte ich könnte einfach meine Instanz des tDatasets im Konstruktor des Dialogs übergeben darauf dann ne bindingsource und klappt. Aber is leider nicht.

    Schaue mir jetzt mal die Helpers .EditCurrent und .EditNew an. Die sind in VB muss ich erstmal übersetzen. Ich melde mich zurück wenn soweit alles klappt.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Als C# Progger verwende ich die Helpers auch nicht. ERD hat hier aber auch ein kleines Beispiel Archiv dabei, das ohne die Helper auskommt.
    Achte auch auf den Import des Dataset im Child-Form: Daten laden, speichern, verarbeiten - einfachste Variante (geht direkt zum Post 7)
    oder sein Anhang aus dem Post: vb-paradise.de/index.php/Attac…2-CrossFormBinding02-zip/

    Ich mach's in C# noch ein bischen anders, in dem ich alle Bindungen neu setze nachdem das DS übergeben wurde

    xChRoNiKx schrieb:

    ich könnte einfach meine Instanz des tDatasets im Konstruktor des Dialogs übergeben darauf dann ne bindingsource und klappt. Aber is leider nicht.
    Naja, kommt drauf an, wie Du es machst. Ich mach's ja nicht anders. Und das klappt problemlos. Daher die Frage: Wie machst Du es, was nicht klappt?
    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.
    @VaporiZed

    ich rufe so den Dialog auf:

    C#-Quellcode

    1. FilterDialog fdiag = new FilterDialog(mainDS1, fId); //fId gleich ID der Serie(kommt vom button click in der datagridview
    2. if(fdiag.ShowDialog() == DialogResult.OK)
    3. {
    4. Console.WriteLine("alles ok");
    5. }


    und das filterDialog sieht so aus:

    C#-Quellcode

    1. public FilterDialog(MainDS _ds, int sId)
    2. {
    3. InitializeComponent();
    4. mainDS = _ds;
    5. episodenBindingSource.Filter = $"SerienId = {sId}";
    6. }


    Allerdings klappt das nicht. Ich kann zwar den Dialog aufrufen und auch rows in dem datagrid hinzufügen allerdings wird das ganze bei klick nicht gespeichert.
    Was ja ein Denkfehler von mir ist da ich ja in dem Dialog mit einer KOPIE des datasets arbeite und nicht mit demselben richtig?

    Wie würde es mit dem selben aussehen?

    @Dksksm hm ja alle Bindungen neu setzten per Code? Is mir zu mühselig dafür gibt es ja das tolle Studio das vieles im Designer kann. Nur bezweifel ich im moment das es genau das kann was ich brauche.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    @Dksksm hm ja alle Bindungen neu setzten per Code? Is mir zu mühselig dafür gibt es ja das tolle Studio das vieles im Designer kann.
    Jo - das ist der Punkt.
    Der Designer kann Controls nur ans lokale Dataset binden, und das ist Mist, wenn man form-übergreifend binden muss.
    Und - ja, das alles per Code zu machen wäre absurd aufwändig.
    Daher braucht man eine schlaue Methode, die das übernimmt, indem sie das Form scant, und die DataSources an den richtigen Stellen umswitcht.

    Eine Alternative verwendet glaub Vaporized, indem er auf dem DialogForm eine Root-BindingSource anlegt, durch die alle Datenflüsse gehen.
    Da muss er nur noch deren Datasource umswitchen.
    Das ist mehr Aufwand im Designer, es bei den Forms so hinzubasteln, aber dafür kann drauf verzichtet werden, das ganze Form zu scannen - und der Code ist leichter verständlich.

    Ich hab halt den (ziemlich komplizierten) Scanning-Code gebastelt und in Extensions verkapselt - jo, der geht nu, und ich habs besonders einfach zu benutzen.

    Bleibt jedenfalls festzuhalten, dass Microsoft da was fabriziert hat, was iwie nicht ganz fertig ist, und man muss selber für zusätzliche Infrastruktur sorgen.
    Ist ja kein Einzelfall - Wpf kann man auch nicht benutzen ohne zusätzliche Bibliotheken von dritt-Anbietern und/oder sich selbst was schreiben.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ja, Maffi macht es so wie ich. Wobei, @Maffi: In form2 kannst Du im Konstruktor die Zeile this.folgenBindingSource.DataSource = this.serienBindingSource; weglassen, denn das hattest Du ja schon im Designer eingestellt. Du brauchst nur das tDS als BindingSource-DataSource zu setzen. Die andere(n) BindingSource(s) ist/sind ja schon auf die Haupt-BS als Datenquelle eingestellt. Die nochmal zu setzen ist überflüssig.

    @xChRoNiKx:
    Das Setzen/Überschreiben der form-eigenen tDS-Instanz reicht nicht. Auch die BindingSource-Verweise müssen neu gesetzt werden, weil sie ja noch auf die alte tDS-Substanz verweisen. Die alte Instanz existiert ja noch, ist nur dann eben nicht mehr über mainDS erreichbar. Den Gedankengang hatte ich auch vor ein paar Jahren, mal sehen, ob ich den alten Thread noch finde. Wie auch immer. Also: ADu musst alle Stellen ausfindig machen, die auf die form-eigene tDS-Instanz verweisen und diese mit der MainForm-tDS neu versehen. Das leistet die Extension von EdR. Oder eben die genannte Alternative: Eine BS pro Form, die auf das tDS an sich verweist (MainBS), alle anderen BS verweisen auf die MainBS. Dann brauchst Du nur die DataSource der MainBS zu ersetzen.
    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“ ()

    Soo erzgänzend zu meinem Post#8
    habe ich in dem FilterDialog Konstruktor das dataset neu gesetzt in der bindingsource und es klappt so halb:

    C#-Quellcode

    1. public FilterDialog(MainDS _ds, int sId)
    2. {
    3. InitializeComponent();
    4. mainDS = _ds;
    5. episodenBindingSource.DataSource = mainDS;
    6. }


    Problem nun: Es ist so das wenn ich da auf ne Serie drücke er dann ALLE Episoden lädt also nicht nur die von der Serie.
    Das liegt sicher daran das es nicht dasselbe bindingsource ist richtig? Oder bin ich da auf dem falschen weg?

    Der weg von @Maffi ist ja quasi auch das die Instanz dieselbe ist. habe ich noch nicht versucht bei mir aber ist dort nicht auch der gleiche "fehler"
    das da die daten erst gefiltert werden müssen oder sowas?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen