Hinzufügen einer DataRow zu einer ChildTable im DetailView

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

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

    Hinzufügen einer DataRow zu einer ChildTable im DetailView

    Hi Leute

    versuche seit ca. 1 Woche eine Lösung zu finden, leider erfolglos. Folgende Situation:

    Ich habe ein typisiertes DataSet mit zwei DataTables. Die Tabelle "Bauvorhaben" ist die übergeordnete, die Tabelle "Investor" die untergeordnete Tabelle.
    In der Tabelle Investor habe ich eine BauvorhabenID-Spalte (Typ Int32). Diese ist mit der ID der übergeordneten Tabelle verbunden, also der Foreign-Key.

    Ich möchte die Tabellen für Parent (Bauvorhaben) und Child (Investor) auf der Form im DetailView anzeigen.

    Bevor die Frage kommt was mit DetailView gemeint ist:
    Im Datenquellen-Explorer kan nman wenn man auf die Tabelle klickt, die Tabelle im DataGridvView anzeigen lassen, oder in einzelnen Controls (DetailView).

    Wenn ich in den Controls der Parent-Table einen Eintrag machen und speichern will, wird nix gespeichert. Ebenso in der Child-Table. Es sind noch keine neuen DataRow vorhanden, also muss man erst mal eine mit BindingSource.AddNew() hinzufügen. Ok, so weit klar.

    Für die Controls der Parent-Table ergibt das Sinn, das kann ich nachvollziehen. Man muss ja schließlich einen neuen Eintrag starten können. Jedoch ist das bei den Controls der Child-Table ebenso. Warum? Gibts ne Möglichkeit, DataRows in den ChildTables zu erzeugen, wenn eine DataRow in der Parent-Table erzeugt wird?

    Wenn ich die Tables über ein DataGridView anzeigen lasse, muss ich da nix weiter machen. Allein das klicken in eine Zelle der DGV erzeugt eine neue DataRow.

    Screens zu DataSet und Form habe ich angehängt.
    Bilder
    • Screenshot 1.png

      11,55 kB, 400×380, 79 mal angesehen
    • Screenshot 2.png

      5,81 kB, 393×384, 83 mal angesehen

    silverbob76GE schrieb:

    also muss man erst mal eine mit BindingSource.AddNew() hinzufügen
    Nee. DeinDataSet.Bauvorhaben.AddBauvorhabenRow(hierAlleDatenDieDerCompilerVerlangt)

    silverbob76GE schrieb:

    Gibts ne Möglichkeit, DataRows in den ChildTables zu erzeugen, wenn eine DataRow in der Parent-Table erzeugt wird?
    Wieso? Wenn ne Firma entsteht, entstehen ja nicht automatisch neue Produkte. Aber neue Produkte können nur entstehen, wenn es auch eine Firma gibt, daher muss es dann danach lauten:
    DeinDataSet.Investor.AddInvestorRow(hierAlleDatenDieDerCompilerVerlangt und an der Stelle, wo die BauvorhabenID kommen müsste, kommt die BauvorhabenRow), also z.B.:

    VB.NET-Quellcode

    1. DeinDataSet.Investor.AddInvestorRow("Architekturbüro Mustermann", "Frau Marina Musterfrau", "030-123456789", "foo@bar.de", DeinDataSet.Bauvorhaben.Last)
    2. 'oder
    3. DeinDataSet.Investor.AddInvestorRow("Architekturbüro Mustermann", "Frau Marina Musterfrau", "030-123456789", "foo@bar.de", DeinDataSet.Bauvorhaben.Single(Function(x) x.ID = 5) 'obwohl man nicht primär mit IDs rumwerfen sollte

    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.
    Hi @VaporiZed

    Danke für deine Antwort. Warum soll ich eine .AddRow einfügen, die Cotrols sind alle gebunden, Eine AddNew würde doch ausreichen, und funzt auch. Oder spricht was dagegen das ich das so machen will?

    Wieso? Wenn ne Firma entsteht, entstehen ja nicht automatisch neue Produkte


    Das stimmt. ist halt mühselig, einen klick zu machen. Habe 4 untergeordnete Tabellen. Für jeden Eintrag in einer der Tabellen muss ich erst eine neue Row hinzufügen. Wenn man das DataGridView verwendet, ist das halt nicht erforderlich.

    Dachte es gibt dazu ne einfache Möglichkeit, wie es bei den DGV'S halt ist. Da reichts in der DGV in die Zelle zu klicken.
    Im DetailView ist ein Klick in die Textbox oder anderes Control nicht ausreichend.
    Solange Du im DetailView bist, musst Du also mehr Aufwand betreiben. Das "Speichern" geht mit Code: DeineBindingSource.EndEdit
    Aber was wäre denn Dein Wunschverhalten, wenn Du ein Bauvorhaben hinzugefügt hast? Dass 3 "leere" Investoren erstellt und zugeordnet werden? Dass bestehende Investoren dem neuen Bauvorhaben zugeordnet werden? Alles ist möglich.
    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.
    Eigentlich will ichs nur verstehen warum das so ist bzw. nur, das die 4 untergeordneten Tabellen eine DataRow erhalten, sobald eine in der Parent-Tabelle erzeugt wird.

    Sonst müsste ich 4 mal eine Row hinzufügen, das geht zwar und ist nicht weiter wild. Aber da kanns ja mal schnell passieren, das vergessen wird den button für AddRow zu klicken. Wenn man dann speichert, sind die Daten weg, nicht gespeichert. Das würde ich gern umgehen wollen. DGV's finde ich vom Design her nicht so doll, ist halt Geschmackssache.

    Noch mal zu meiner Frage: Eher mit Dts.DataTable.AddRow(alle Überladungen), oder ist das gleichzusetzen mit BindingSource.AddNew(), wenn die Controls gebunden sind?
    Verstehe ich Deine Frage richtig: Bei Dir erhalten die SubTables automatisch Rows, sobald in der ParentTable eine Row hinzugefügt wird? Das passiert von Haus aus nicht. Oder willst Du, dass das passiert? Dann kannst Du nach dem SuperTableBindingSource.EndEdit noch schreiben SubTable1BindingSource.AddNew, SubTable2BindingSource.AddNew, SubTable3BindingSource.AddNew, SubTable4BindingSource.AddNew
    Oder ich versteh Deine Frage oder Dein Anliegen immer noch nicht und es wäre gut wenn Du in einfachen Worten den Ist- und Sollzustand beschreibst.
    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.
    Aktuell erhalten die SubTables natürlich nicht automatisch eine DataRow, das geht ja im DetailView nicht. Habe dazu pro Table ein button auf der Form, der wenn gelickt eine neue Row hinzufügt.

    Ist: 1 Haupttable, 4 SubTables, alle im DetailView. Für jede Table ist ein Button vorhanden, der eine Row über BindingSource.AddNew hinzufügt.

    Soll: es wäre schön, das die SubTables autoamtisch eine Row erhalten, wenn ich in die Zelle klicke. Also qausi wie bei nder DGV.
    Wenn das nicht geht, wäre es auch ok. Noch mal ein Screen vom Form.
    Bilder
    • Screenshot 3.png

      33,93 kB, 1.203×557, 85 mal angesehen

    silverbob76GE schrieb:

    das die SubTables autoamtisch eine Row erhalten, wenn ich in die Zelle klicke
    Was immer Du mit Zelle meinst, ginge das mit Code, also sobald man in die erste TextBox (Zelle?) einer GroupBox klickt und in den restlichen noch keine Daten sind, dann BindingSource.AddNew. Oder willst Du das ganz ohne Eigencode?
    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.
    Sorry, Zeile oder Zelle einer DGV. Die DataRow ist dann doch automatisch ohne weiteren Code im Bearbeiten-Mode, was ja auch bedeutet dasd eine DataRow erzeugt wurde.

    Schön wäre es, wenn das gleiche Verhalten auftritt, wenn man in eins der Controls klickt. Das man das bei einer Textbox über TextBox.Enter erreichen könnte, ist mir klar. Aber dann müsste ich das für jedes einzelne Control (also jede Spalte) einer SubTable machen.

    Es scheint mir, das das im DetailView nicht so gewollt ist, bei einer DGV schon. Korrigier mich bitte, wenn ihc falch liege.
    Der DetailView zeigt ja nur die Daten der bestehenden gewählten DataTable-Zeile.
    Füllt man die stets leere letzte DGV-Zeile, wird automatisch eine neue angelegt. Es ist also eine Besonderheit des DGVs, welches hier zum Tragen kommt. Das ist daher m.E. für den DetailView nicht ohne Zusatzaufwand/Code erreichbar.
    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.
    Ok, sowas hatte ich befürchtet. Dann werd ich das so akzeptieren und zu jeder Tabelle einen button hinzufügen, der eine neue Row hinzufügt.

    Also bleibt nur noch eine Sache. Du hast am Anfang geschrieben, ich soill eine neue Row über Dts.DataTable.AddRow hinzufügen.
    Ich machs ja aktuell über .AddNew().

    Was ist sauberer gecodet, oder ist es in dem Fall egal?
    Es sind 2 Paar Socken.
    Du startest bei gähnender Leere. In einem DetailView hast Du den Fall, dass Du erst mit AddNew eine neue, leere Zeile anlegst, dann diese mit den TextBoxen etc. mit Daten befüllst und dann abspeichern musst. Entweder explizit durch EndEdit oder durch ein weiteres AddNew (was wieder eine leere Zeile mit sich bringt).
    Mit der Dts.DataTable.AddDataTableRow-Variante fügst Du eben eine befüllte Zeile der DataTable direkt hinzu, musst aber da alle Werte angeben, da das DataBinding nicht für eine nichtexistente Row greift.
    weniger Code, mehr Aufwand für den User (neu anlegen, Daten eingeben, speichern oder neue Row anlegen): AddNew.
    mehr Code, weniger Aufwand für den User (Daten eingeben, speichern): Dts.DataTable.AddDataTableRow
    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.
    Mir fällt noch was ein: Da Du GroupBoxen hast, kannst Du auch deren Enter-Event(Handler) nutzen, um ggf. eine neue Tabellenzeile zu erstellen. Oder es eben lassen, wenn die letzte noch komplett leer ist. Dann ist der Aufwand auf eine Codestelle pro Tabelle reduziert.
    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.