Gebundene Tabelle, Neuen Eintrag erstellen per Code

  • VB.NET

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

    Gebundene Tabelle, Neuen Eintrag erstellen per Code

    Hi,

    ich habe zwei Tabellen. Die miteinander gebunden sind.
    Verein -> Mitglieder

    eine Tabelle Adressen die nicht gebunden ist.

    Jetzt möchte ich in die Tabelle Mitglieder einen neunen Datensatz anfügen.
    Mache ich das im DGV geht das ohne weiteres. Die Vereins ID wird in der Tabelle Mitglieder automatisch eingefügt.
    Cool

    Nun versuche ich mittels Code einen Datensatz anzufügen.

    VB.NET-Quellcode

    1. Private Sub AdressenDataGridView_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles AdressenDataGridView.CellDoubleClick
    2. Dim rwAdr = DirectCast(DirectCast(AdressenBindingSource.Current, DataRowView).Row, AdressenRow)
    3. Dim DataTableMitglieder As DataSet1.MitgliederDataTable = DataSet1.Mitglieder ' DataTabel
    4. Dim RowMitglied = DataTableMitglieder.NewMitgliederRow ' Row
    5. RowMitglied.Adress_ID = rwAdr.Adr_ID ' Spalte in Row
    6. DataTableMitglieder.AddMitgliederRow(RowMitglied) ' Add Row
    7. End Sub


    Die entsprechende ID aus der AdressenBindingSource wird geholt. Sie ist also vorhanden.

    Der Eintrag wird aber nicht in die Mitglieder Tabelle eingetragen.

    Was habe ich übersehen bzw. falsch gemacht ?

    lieben dank

    Bernd
    @Freefighter
    ich kenne das Tool. Danke dir.


    So ich habe meinen Fehler gefunden.

    Adde ich einen DatenSatz über das DGV setzt er logischerweise die Id des Verein automatisch. (Relation)
    Wenn ich über den Code Adde macht er das nicht.
    Somit muss ich die Vereins ID manuell auslesen und mitgeben.

    VB.NET-Quellcode

    1. Private Sub AdressenDataGridView_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles AdressenDataGridView.CellDoubleClick
    2. Dim rwAdr = DirectCast(DirectCast(AdressenBindingSource.Current, DataRowView).Row, AdressenRow)
    3. Dim rwVer = DirectCast(DirectCast(VereineBindingSource.Current, DataRowView).Row, VereineRow)
    4. Dim DataTableMitglieder As DataSet1.MitgliederDataTable = DataSet1.Mitglieder ' DataTabel
    5. Dim RowMitglied = DataTableMitglieder.NewMitgliederRow ' Row
    6. RowMitglied.Adress_ID = rwAdr.Adr_ID ' Spalte in Row
    7. RowMitglied.Name = rwAdr.Adr_Name
    8. RowMitglied.Vorname = rwAdr.Adr_Name
    9. RowMitglied.Verein_ID = rwVer.Ver_ID
    10. DataTableMitglieder.AddMitgliederRow(RowMitglied) ' Add Row
    11. End Sub
    Zu früh auf erledigt geklickt.

    Wenn ich das ganze Form übergreifend versuche geht es leider nicht.

    VB.NET-Quellcode

    1. Private Sub AdressenDataGridView_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles AdressenDataGridView.CellDoubleClick
    2. ' Adress ID auslesen
    3. Dim rwAdr = DirectCast(DirectCast(Me.AdressenBindingSource.Current, DataRowView).Row, AdressenRow)
    4. Dim DataTableMitglieder As DataSet1.MitgliederDataTable = DataSet1.Mitglieder ' DataTabel
    5. Dim RowMitglied = DataTableMitglieder.NewMitgliederRow ' Row
    6. RowMitglied.Adress_ID = rwAdr.Adr_ID ' Spalten in Row
    7. RowMitglied.Name = rwAdr.Adr_Name
    8. RowMitglied.Vorname = rwAdr.Adr_Name
    9. ' ID aus Property, stimmt aber.
    10. RowMitglied.Verein_ID = Form1.Aktuell_User.Prog_User_Verein_ID ' rwVer.Ver_ID
    11. DataTableMitglieder.AddMitgliederRow(RowMitglied) ' Add Row


    was habe ich denn jetzt wieder übersehen ?

    lieben dank

    Bernd
    Was stimmt an der VereinID aus der Property nicht?

    Ah - Form-übergreifend, und jedes Form hat ein eigenes Dataset!

    Und im aktuellen Form hast du die möglichen Vereine nicht geladen, und daher kannst du auch kein Mitglied adden?

    Bei Form-übergreifend mußt du eine entsprechende Anwendungs-Architektur wählen - gugge [VB 2008] Grundsätzliche Frage zum Umgang mit DataSets

    Am Ende poste ich auch eine ganze Infrastruktur, die den ganzen TableAdapter-Quark, und redundante Datasetse und Zeugs ein für allemal löst.
    Allerdings erstmal nur für Access. MySql issn annerer Dialekt, da müsste ich bisserl an den Sql-Generatoren rumschrauben.

    aber ich empfehle nochmal dringend, erstmal mit ohne Datenbank zu entwickeln - stattdessen das Dataset direkt auf Platte schreiben.

    Etwa dein Ansatz beruht auf einem unhaltbaren Datenmodell.
    Was du bastelst, ist eine m:n - Relation zwischen Verein und Addresse. Nur hast du leider die erforderliche Relation Addresse->Mitglied nicht gesetzt.
    Das kann man trotzdem lösen, aber ist Murks.
    Und sobald du dein Modell korrigiert hast, wirste die Q&D - Lösung wieder weghaben wollen.

    Aber weil du jetzt Datenbank und Dataset ändern mußt, magst du zu Q&D geneigt sein.

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

    ErfinderDesRades schrieb:

    Etwa dein Ansatz beruht auf einem unhaltbaren Datenmodell.
    Was du bastelst, ist eine m:n - Relation zwischen Verein und Addresse.

    Das ist übrigens eine voll interessante Idee.

    Weiter gedacht ergibt sich ein Modell, bei dem man Adresse durch Person ersetzt, denn Adresse ist eine Eigenschaft einer Person (jede hat genau eine)

    Und dann sagt m:n Person:Verein aus, dass jede Person eine Mitgliedschaft in mehreren Vereinen haben kann, und jeder Verein hat Mitgliedschaften mehrerer Personen - und das ist genau die Realität!

    Dein Modell verschiebt sich also bischen in den Bedeutungen der Entitäten: aus Adresse wird Person, und aus Mitglied wird Mitgliedschaft.

    Und dann modelliert es die Realität viel besser, als die Vorstellung: "ein Verein hat viele Mitglieder."
    Das ist nämlich falsch. Ein Verein hat keine Mitglieder, sondern Mitgliedschaften.