Auf Datatable in Relation zugreifen

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von klyer.

    Auf Datatable in Relation zugreifen

    Hallo Com,

    wieder komme ich nicht weiter: In meinem Programm kann ich Buchungen bearbeiten (bearbeitet wird in einer separaten Form). Zu jeder Buchung gehören aber auch Zusatzkosten, diese sind an die jew. Buchung gebunden.
    Die Buchung also die Form zum bearbeiten rufe ich mit Datarowview auf

    VB.NET-Quellcode

    1. Dim drv As DataRowView = DirectCast(frmMain.ReservationsBindingSource.Item(BookingID), DataRowView)
    2. frm.ReservationsBindingSource.DataSource = drv
    3. frm.ZusatzkostenBindingSource.DataSource = ???


    Das klappt super. Nun komme ich aber an der Stelle nicht weiter, an welcher ich die Zusatzkosten, welche ja speziell an eine Buchung gebunden sind, gebunden werden sollen. Aus dem Bearbeiten-Fenster heraus wird auf die Zusatzkosten zugegriffen.
    Alles was ich habe ist halt die BookingID bzw. die Datarowview dazu.
    Wie könnte ich das ohne Helper erst einmal realisieren?
    Das was ich brauche ist doch folgendes: ArticleBindingSource.EditCurrent(Of dlgArticle)() ?

    In VB10Projects aus deinem Link erhalte ich folgende Fehlermeldung:




    In deinen vielen Projekten rufst du doch immer das "Bearbeiten-Fenster" aus dem Datagridview heraus auf?! -> In meinem Fall habe ich doch nur die Datarowview - wie gehe ich da vor...

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

    Ich könnte die Plattform umstellen auf x86, dann ist schon einmal die Fehlermeldung weg - aber dann funktioniert meine Anwendung nicht mehr :)
    Gibt es eine Möglichkeit dies auch ohne Helper zu realisieren (schon mal angedeutet)?
    Um die Helper - Einbindung wollte ich mich auch später kümmern.
    Edit: Ich öffne mit VS UL.
    also kannst du nicht einfach downloaden und meine Solution starten?

    Kern formübergreifenden Databindings ist, dass alle BindingSources aller Forms aufs selbe Dataset umgestöpselt werden müssen. Inne Helpers wird das erledigt, wenn ein Form sein Dataset registriert, bzw. für Dialoge gibts eine Extra-Extension.

    Wenn du die Umstöpselung selber codest, dann kein Problem.

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

    ErfinderDesRades schrieb:

    Wenn du die Umstöpselung selber coden kannst, dann kein Problem.

    Tja....das wäre schön.
    Ich hatte gedacht, das die Bindingsource der Zusatzkosten irgendwie den Index von der Buchung bekommt und damit weiß, das sie dazu gehört...

    Noch einmal heruntergeladen -> entpackt -> F5 -> gleiche Fehlermeldung

    Edit: vl. muss ich was im Konfigurations-Manager umstellen? -> Habe Win 8 x64
    Habe vor kurzm mit ähnlichen Problemen zu kämpfen gehabt.
    Hab' alle eingebundenen DLL's auf AnyCPU kompiliert. Wegen Zugriff auf Access-MDB (der MS-Treiber zickt bei x64) das Hauptproject auf x86 - klappt.

    Wenn im Formload-Event einb Fehler auftritt, wird unter Windows x64 (losgelöst von den Projekteinstellungen) KEINE Exception ausgelöst, alles was nach dem Fehler kommt, wird ignoriert, und das Form einfach angezeigt (Code verlagern in FormShown hilft nicht immer, da manchmal aus mir nicht erklärlichen Gründen auch diese Behandlungsroutine ignoriert wird)

    Habe mir deshalb angewöhnt, den Code im Formload-Event während der Entwicklungsphase in einen Try ... Catch-Block zu packen, und im Catch-Bereich ein STOP-Anweisung zu plazieren. Dann kannst Du relativ leicht die Fehlerursache erkennen.

    ErfinderDesRades schrieb:

    binde doch das ganze Helpers-Projekt ein. vlt. willste den Code ja auch iwann mal modifizieren.


    Ganzes Proj. eingebunden. Geht! musste nur den Helper auf AnyCPU umstellen. Danke.

    Folgendermaßen öffne ich meine Zusatzkosten:

    VB.NET-Quellcode

    1. frmMain.ZusatzkostenBindingSource.EditCurrent(Of frmZusatzkosten)()


    Wie verknüpfe ich das nun mit der DataRowView?

    Edit: @us4711 Vielen Dank für den Tipp. Werd ich mir merken.

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

    wenn du meine Extension verwendest, brauchst du nichts weiter zu tun.

    Allerdings willst du doch den Current der ReservationsBindingSource editieren, also

    VB.NET-Quellcode

    1. frmMain.ReservationsBindingSource.EditCurrent(Of frmZusatzkosten)()


    So "nebenbei": frmMain ist eine Klasse, und kein Objekt - gugge Instanziierung von Forms und Aufruf von Dialogen
    frm.Main steht eigentlich nur davor, weil ich frmEditBooking daraus öffne. Ich übergebe sozusagen die Bindingsources an frmEditBooking.
    Momentan "Registriere" ich nicht zu Anfang mein Dts, sondern lass es noch normal über LoadXML laden....wenn ich dann "frmMain.ReservationsBindingSource.EditCurrent(Of frmZusatzkosten)()" aufrufe kommt nur die Exception.
    Daraus schließe ich, dass ich wahrscheinlich alles über den Helper laufen lassen muss.

    Momentan habe ich nur ein Problem, dass ich aus einer Klasse heraus einen Kalender erstelle und deswegen dort eigenständig LoadXML aufrufen muss....das geht ja mit dem Helper nicht?!

    klyer schrieb:

    Momentan "Registriere" ich nicht zu Anfang mein Dts, sondern lass es noch normal über LoadXML laden.

    Du musst das Problem verstehen:
    Jedes Form, wo du im FormDesigner ein typDataset verwendest, hat sein eigenes typDataset!

    Das heisst, wenn du 3 Forms offen hast, fahren da 3 Datasetse bei dir herum, und da geht natürlich nix mit formübergreifendem Databinding, denn was interessiert das DGV auf Form1, wenn im DGV auf Form2 iwas gändert wird?

    Deshalb muß jedes Form sein Dataset "registrieren". (Dabei wird dieses Dataset entsorgt, und die Variable auf eine anwendungsweit nur einmalig vorkommende Dataset-Instanz gesetzt).
    Ab dem Zeitpunkt wirkt das, was du in Form2 mittm Dataset treibst, per Databinding auch aufs Form1, denn beide DGVs hängen nun am selben Dataset.
    OK. Verstanden und soweit umgesetzt.

    Folgendes vl. noch einmal etwas klarer: Einen Kalender fülle ich dynamisch mit Controls, welche Buchungen darstellen. Das Füllen geschieht über ein Dts. Das erstellen der Controls übernimmt eine Klasse, in welche das Dataset per ReadXML geladen wird um die versch. Controls zu erzeugen. Jedes Control erhält eine BookingID. Wenn ich eine Buchung bearbeite, klicke ich auf das Control und übertrage so die Bindingsource an das Editier-Fenster. Aus dem Editier-Fenster heraus öffne ich u.a. die Zusatzkosten.

    Ich würde sagen, das ganze Globale und Formübergreifende Databinding ist hinfällig solange ich nicht die Klasse vernünftig laden kann. Denn es "resultiert" alles irgendwie von dort heraus, oder?
    Aus einer Form heraus laden, das würde ich auch gern machen - das Problem ist nur, dass ich Dataset.Tables laden muss, da ich nicht direkt aus der Bindingsource laden kann

    Also so:

    VB.NET-Quellcode

    1. Dim BookingID As DataRow = HotelDB.Tables(0).Rows(i)


    Wenn ich mit HotelDB.Datatable kommen will, streikt er - Natürlich, weil ich ja keine Bindingsource in die Klasse "geladen" habe.... also wenn ich das irgendwie ändern könnte, wäre das alles kein Problem.

    Edit: Oder muss ich eine Bindingsource in der Klasse zur Laufzeit erstellen und dann von einer Form aus füllen lassen?
    Nein.
    Du zeigst doch Daten auch auf dem Mainform an, oder?
    Dann musst du das Dataset doch auch inne MainForm befüllen, oder?
    Ja, und dieses Dataset kannst du doch diener Klasse übergeben, oder was ist das Problem? (ich weiß nicht, was das nun mit einer BindingSource zu tun hat)