Zeilen eines ParentChildView kopieren und erneut hinzufügen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von silverbob76GE.

    Zeilen eines ParentChildView kopieren und erneut hinzufügen

    Hallo Leute

    bin gerade dabei ein Prog zu schreiben, um Aufträge zu erstellen. Dem User soll es möglich sein, einen Stornoauftrag zu erstellen.
    Den Stornoauftrag möchte ich quasi als Duplikat per button click erstellen lassen.

    Ich habe dazu ein DataSet mit zwei DataTables im Parent-Child View. Über eine Relation werden mir in der "Child"-Tabelle alle Positionen angezeigt, die zu dem Auftrag gehören.
    Wenn ich nun die DataRows kopieren und einen "neuen" Auftrag mit den kopierten Zeilen erzuegen möchte, muss ich zunächst im "Parent" eine neue Zeile hinzufügen.

    Die neue Zeile zum Parent hinzufügen klappt. Ich schaffe es leider nicht, die Zeilen für den "Child" aus dem vorherigen Auftrag in den neuen "Stornoauftrag" hinzuzufügen.

    Mein Code wie folgt:

    DataSet => Gesamtaufträge
    DataTable Parent => AlleAufträge
    DataTable Child => Einzelaufträge

    VB.NET-Quellcode

    1. 'Zeile für Parent kopieren und hinzufügen.
    2. Dim rowduplicat = Gesamtaufträge.Alleaufträge.NewAlleaufträgeRow()
    3. Dim row = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)
    4. rowduplicat.ANummer = row.ANummer + " Storno!"
    5. rowduplicat.Bauvorhaben = row.Bauvorhaben
    6. rowduplicat.Kunde = row.Kunde
    7. rowduplicat.Auftragsdatum = row.Auftragsdatum
    8. AlleaufträgeBindingSource.MovePrevious() ' Da nach dem erzuegen die bindingsource in die nächste Zeile springt, gehe ich wieder eine Zeiel zurück um die Daten für neuen DataRows zu erzeugen.
    9. Dim row1 = DirectCast(DirectCast(FKAlleaufträgeEinzelaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.EinzelaufträgeRow)
    10. 'Zeilen für Child hinzufügen.
    11. For Each drv As DataRowView In FKAlleaufträgeEinzelaufträgeBindingSource.List
    12. Dim rowduplicat1 = Gesamtaufträge.Einzelaufträge.NewEinzelaufträgeRow()
    13. rowduplicat1.Kunde = row1.Kunde
    14. rowduplicat1.Bauvorhaben = row1.Bauvorhaben
    15. rowduplicat1.ANummer = row1.ANummer
    16. rowduplicat1.Pos = row1.Pos
    17. rowduplicat1.Leistung = row1.Leistung
    18. rowduplicat1.Menge = row1.Menge
    19. rowduplicat1.Einheit = row1.Einheit
    20. rowduplicat1.Einheitspreis = row1.Einheitspreis
    21. rowduplicat1.Auftragsdatum = row1.Auftragsdatum
    22. Gesamtaufträge.Einzelaufträge.Rows.Add(rowduplicat1)
    23. FKAlleaufträgeEinzelaufträgeBindingSource.MoveNext()
    24. Next
    25. Gesamtaufträge.Alleaufträge.Rows.Add(rowduplicat)
    26. Gesamtaufträge.Alleaufträge.AcceptChanges()
    27. Gesamtaufträge.Einzelaufträge.AcceptChanges()
    28. Gesamtaufträge.Alleaufträge.WriteXml(aufträgekomplett)
    29. Gesamtaufträge.Einzelaufträge.WriteXml(Kundenauftrag)


    Bin mir nicht sicher ob das verständlich war. Die zu kopierenden Zeilen werden nicht in den Stornoauftrag eingefügt, da die Zeilen "rowduplicat1" sich immer noch in der bindingsource.current befinden.
    Die zeile über "Add" kann ich nur innherlab der Schleife hinzufügen, da diese außerhalb nicht erkannt wird.

    Vielleicht ist das alles zu umständlich. Jemand ne Idee wie ich das hinbekomme? Oder gibts eventuell einen viel simpleren Weg?

    Bin dankbar für jeden Tip oder Ansatz.
    Hallo @silverbob76GE

    Ich kann mich irren aber ich denke das ist WinForms und nicht WPF, du hast zwar schon < 50 Beiträge aber ich denke du hast dich hier dennoch vertan.
    Bitte kläre das mal und gib Bescheid.

    Grüße
    Sascha

    Edit: Verschoben aus dem WPF Bereich
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    Arbeite auf den Daten.
    AlleaufträgeRow hat eine Function GetEinzelaufträgeRows(), das sind die Einzelaufträge, die du kopieren willst.
    Dann verwende die Einzelaufträge.AddEinzelaufträgeRow()-Methode, in der Überladung mit den vielen Parametern.
    Die vielen Parameter diktieren dir genau, was alles du angeben musst, um die neuer EinzelaufträgeRow erfolgreich und gültig hinzuzufügen.

    In BindingSources brauchst du da nicht rumzuhampeln.
    Allenfalls wenn der Vorgang abgeschlossen ist, kannst du AlleaufträgeBindingSource auf die Position des neuen Alleaufträge setzen (aber das kann auch erstmal der User)

    Fürchterliche Benamung hast du übrigens: Was bei mir ein Auftrag wäre ist bei dir ein AlleAufträge. Das ist schoma gelogen, denn ein Datensatz ist kein Plural, sondern nur einer.
    Zum andern die Umlaute - sowas geht lange gut, fliegt einem aber iwann um Ohren, wenn iein Tool, oder auch das VS selbst, sich mit der Culture verhaspelt.
    Hallo ErfinderDesRades,

    Danke erst mal für deine Mühe, das du dir den Beitrag reingezogen hast.

    Ja, die Namensgebung ist leider blöd, gebe ich zu. Hab erst vor kurzem deinen Link dazu in einem anderen Beitrasg gesehen.
    Eventuell werd ich das noch mal umbauen, damits leserlich bleibt.

    Ich schau mal ob ich das mit deinem Tip hinbekomme. Aber schon mal Danke vorweg für die Antwort.

    Wie kann ich die Function GetEinzelaufträgeRows() aufrufen? Muss ich die als Public Function definieren oder wie meinst du das?

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

    Bin glaube ich immer noch auf dem Holzweg.

    Also, hab versucht die Function GetEinzelaufträgeRows() aufzurufen.

    VB.NET-Quellcode

    1. Dim row = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)
    2. Dim row1 = DirectCast(DirectCast(FKAlleaufträgeEinzelaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.EinzelaufträgeRow)
    3. row.GetEinzelaufträgeRows()
    4. For Each drv As DataRowView In FKAlleaufträgeEinzelaufträgeBindingSource.List
    5. Dim row2 = Gesamtaufträge.Einzelaufträge.NewEinzelaufträgeRow
    6. Gesamtaufträge.Einzelaufträge.AddEinzelaufträgeRow(row2, Kunde:=row1.Kunde.ToString, Bauvorhaben:=row1.Bauvorhaben.ToString,
    7. ANummer:=row1.ANummer.ToString, Pos:=row1.Pos.ToString, Leistung:=row1.Leistung.ToString, Menge:=CDbl(row1.Menge), Einheit:=row1.Einheit.ToString,
    8. Einheitspreis:=CDec(row1.Einheitspreis), Skonto:=CDec(row1.Skonto), Auftragsdatum:=row1.Auftragsdatum.ToStrin
    9. FKAlleaufträgeEinzelaufträgeBindingSource.MoveNext()
    10. Next


    Klappt net. Weiß aber auch nicht mehr wo ich ansetzen soll. Das Bild soll erläutern was passieren soll. Die beiden Zeilen "Wände", "Decken" sollen in den neuen Auftrag eingefügt werden, damit der Storno erfolgen kann.
    Bilder
    • Auftrag.png

      4,39 kB, 204×322, 120 mal angesehen

    silverbob76GE schrieb:

    Wie kann ich die Function GetEinzelaufträgeRows() aufrufen?

    ErfinderDesRades schrieb:

    AlleaufträgeRow hat eine Function GetEinzelaufträgeRows()
    Mehr gibt es dazu nicht zu sagen.
    Das mit der Benennung der DataTables ist eine Glaubenssache. Denn wenn ich eine DataTable namens Auftrag habe, dann würde es mich grausen, wenn ich schreiben müsste:

    VB.NET-Quellcode

    1. For Each Einzelauftrag In Auftrag
    2. '…
    3. Next

    Oder mit der von mir bevorzugten LINQ-Variante: Auftrag.ForEach(Sub(x) …)
    Wenn ich ne Liste habe, benenn ich sie auch im Plural: Dim Cookies As New List(Of Cookie) und schreibe dann Cookies.ForEach. Da hätte ich gern die Erklärung, warum ich bei ner DataTable-Benennung (und ja, jetzt sage ich es endlich mal: ich hasse das Wort "Benamung") Singular verwenden soll, obwohl ne DataTable viele Elemente enthält, aber ne Liste soll ich im Plural bezeichnen, weil Dim Cookie As New List(Of Cookie) ist ja ein Unding, Dim CookieList As New List(Of Cookie) ist redundant (Pseudo-ungarische-Notation) und mit sowas wie CookieBox fangen wir mal gar nicht erst an.
    Das einzige Problem, was ich momentan beim Plural sehe, sind die automatisch erstellten Prozeduren des tDS. Cookies.AddCookiesRow(). Aber 1. kommt das bei mir selten vor und 2. ist das ein MSDN-Problem, welches man notfalls (!) auch noch durch Umbenennung (und nicht "Umbenamung") ändern könnte - sobald man mit der tDS-Konfiguation fertig ist.
    @ErfinderDesRades: Verwendest Du das Wort "Benamung" mit voller Absicht oder ist das so ne Verballhornung wie "Datumse"?

    ##########

    @silverbob76GE: Öhm, ja. Zeile#4 ist n bisken wenig. Du machst ja gar nix mit der Row.
    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“ ()

    Nun, das das zu wenig ist hab ich mir gedacht. Weiß aber nicht wie ich da ansetzen muss.
    Dachte das ich mit der Function nur die GetRow Methode aktiviere. Über die Einzelaufträge.AddEinzelaufträgeRow habe ich ja die Zeilen angesprochen die ich duplizieren will.

    Was muss ich hier ergänzen?

    VB.NET-Quellcode

    1. row.GetEinzelaufträgeRows()
    Das ist eine Funktion, also eine Prozedur, die etwas zurückgibt.
    Somit:

    VB.NET-Quellcode

    1. Dim DieEinzelaufträgeFürDieRow = row.GetEinzelaufträgeRows() 'ja, die Benennung ist ausbaufähig, aber jetzt weiß man erstmal konkret, was drinsteckt

    Und dann arbeitest Du eben mit DieEinzelaufträgeFürDieRow weiter. Was immer Du mit den Einzelaufträgen dieser Row auch machen willst.
    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.
    Es sind viele Rows - also eher

    VB.NET-Quellcode

    1. Dim row = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)
    2. dim DieEinzelaufträgeFürDieRow = row.GetEinzelaufträgeRows()
    3. for each rwEinzel in DieEinzelaufträgeFürDieRow
    4. '...
    5. Next

    Aber das ist nichts als die sklavische Anwendung dessen, was ich in post#4 bereits sagtete.
    Das ist also recht problematisch, wenn du so eine einfache Aussage:
    AlleaufträgeRow hat eine Function GetEinzelaufträgeRows()
    nicht verstehst.
    AlleaufträgeRow ist ein Datentyp - eine Klasse um genau zu sein.
    Und dieser Datentyp stellt die Methode GetEinzelaufträgeRows() bereit.
    Also alle Objekte vom Typ AlleaufträgeRow haben eine Methode GetEinzelaufträgeRows().

    Da solltest du zusehen, deine Wissenslücken qualifiziert zu füllen - anders kann ich mir nicht vorstellen, dass man eine Datenverarbeitungs-Anwendung erfolgreich zu einem Abschluss bringen kann.
    Grundlagen: Fachbegriffe
    ist eine grob-Übersicht - was so Dinge wie Datentypen, Vererbung, Enums etc im einzelnen ist, da könntest du ein Online-Buch durcharbeitetn, etwa Kühnel/Leibhard (nicht den Theiss - der ist schlecht!)

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

    Ja, stimmt schon. Hab mir das meiste Wissen über deine Tuts, Google und das Forum angeeignet. Ein gescheites Buch muss ich mir noch besorgen.
    Das Prog funzt eigentlich so weit gut, bis auf diese Funktion. Muss definitiv noch an den Grundlagen arbeiten, das ist auf alle Fälle klar.

    Aber noch mal zurück zu meinem Problem. Ich muss die einezlenen Paramter der AddEinzelaufträgeRow übergeben.
    Damit die Schleife abgearbeitet wird, muss ich doch jedes mal eine neue Row erzeugen:

    VB.NET-Quellcode

    1. Dim row = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)
    2. Dim einzelrow = row.GetEinzelaufträgeRows()
    3. For each rweinzel In einzelrow
    4. Dim rowneu = Gesamtaufträge.Einzelaufträge.NewEinzelaufträgeRow
    5. Gesamtaufträge.Einzelaufträge.AddEinzelaufträgeRow(rowneu, Kunde:=rweinzel.Kunde.ToString, Bauvorhaben:=rweinzel.Bauvorhaben.ToString,
    6. ANummer:=rweinzel.ANummer.ToString, Pos:=rweinzel.Pos.ToString, Leistung:=rweinzel.Leistung.ToString, Menge:=CDbl(rweinzel.Menge), Einheit:=rweinzel.Einheit.ToString,
    7. Einheitspreis:=CDec(rweinzel.Einheitspreis), Skonto:=CDec(rweinzel.Skonto), Auftragsdatum:=rweinzel.Auftragsdatum.ToString)
    8. Next


    Trotzdem klappst nicht. Die Zeilen werden nicht angefügt.
    Der erste Parameter stimmt nicht. Da will die Funktion wissen, wer oder was die ParentRow ist. Du gibst da aber ne leere, neue ChildRow an. Kompiliert das überhaupt? Ist doch der falsche Datentyp. Oder ist die DataTable irgendwo mit sich selber verknüpft? Bitte Screenshot des DataSet-Designers hochladen.
    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.
    Bei der AddRow Funktion muss ich doch den Bezug zur EInzelaufträgeRow herstellen. Wenn ich da ne ParentRow eintrage, kriege ich ne Fehlermedlung.


    Hab den fehlenden Paramter ergänzt mit

    Dim row = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)

    Die Zeilen werden nun auch ergänzt, allerdings nicht im Stornoauftrag, sondern im gleichen Parentauftrag, aus dem sie kopiert wurden.

    Hab nun ne neue Zeile erzuegt im als Parent, und siehe da, die Zeilen werden ergänzt. Super, funzt. Vielen lieben Dank.


    Bilder
    • grafik2.png

      14,92 kB, 633×397, 114 mal angesehen
    • grafik3.png

      32,51 kB, 1.523×180, 121 mal angesehen

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

    Ja, genau, sagt ja der Compiler: Er will ne AlleAufträgeRow. Du wolltest ihm aber in Post14 ne EinzelaufträgeRow unterschieben:

    VB.NET-Quellcode

    1. Dim rowneu = Gesamtaufträge.Einzelaufträge.NewEinzelaufträgeRow
    2. Gesamtaufträge.Einzelaufträge.AddEinzelaufträgeRow(rowneu, …)

    Das war mein Problem.
    Du willst eine EinzelaufträgeRow erstellen. Die kann aber nur in Abhängigkeit von einer AlleAufträgeRow existieren. Ohne sie fehlt ihr was. Du musst dem Compiler quasi mitteilen, zu welcher ParentRow die neue ChildRow gehört.
    Aber sag mal: In welche Tabelle gehört denn der Stornoauftrag? AlleAufträge oder Einzelaufträge?
    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.
    Konnte mit den Angaben von IntelliSense nicht viel anfangen, aber nun leuchtets ein.
    Bin echt dankbar das es so ein Forum gibt. Und bin auch froh für die vielen Denkanstöße.

    ErfinderdesRades hat recht, werd mir das Buch besorgen, das sind zuz einfache Dinge die da fehlen.

    Vielen Dank und einen schönen Abend noch :)

    @VaporiZed: der Stornoauftrag wird im Parent erzeugt, und im Child sollen die Zeilen aus der Parentrow zueghlörigen Childrow rein.
    Die Parentrow erzeuge ich mit:

    VB.NET-Quellcode

    1. Dim rowduplicat = Gesamtaufträge.Alleaufträge.NewAlleaufträgeRow()
    2. Dim row = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)
    3. rowduplicat.ANummer = row.ANummer + " Storno!"
    4. rowduplicat.Bauvorhaben = row.Bauvorhaben
    5. rowduplicat.Kunde = row.Kunde
    6. rowduplicat.Auftragsdatum = row.Auftragsdatum


    Ich gehe also hin, übernehme die Daten aus der Bindingsource.current, und erzeuge damit eine neue ParentRow.
    Dann gehe ich mit der GetRow-Methode hin, kopiere alle zugehörigen Childrows, und füge diese dann über die NewAlleAufträgeRow in die neue ParentRow hinzu.

    Die GetRow-Zeile sieht dann so aus:

    VB.NET-Quellcode

    1. Dim row2 = row.GetEinzelaufträgeRows()
    2. For Each rweinzel In row2
    3. Gesamtaufträge.Einzelaufträge.AddEinzelaufträgeRow(parentAlleaufträgeRowByFK_Alleaufträge_Einzelaufträge:=[b]rowduplicat[/b], Kunde:=rweinzel.Kunde.ToString, Bauvorhaben:=rweinzel.Bauvorhaben.ToString,
    4. ANummer:=rweinzel.ANummer.ToString, Pos:=rweinzel.Pos.ToString, Leistung:=rweinzel.Leistung.ToString, Menge:=CDbl(rweinzel.Menge), Einheit:=rweinzel.Einheit.ToString,
    5. Einheitspreis:=CDec(rweinzel.Einheitspreis), Skonto:=CDec(rweinzel.Skonto), Auftragsdatum:=rweinzel.Auftragsdatum.ToString)
    6. Next





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

    Ich find das uneinheitlich, wenn du für AlleAufträge die NewAlleAufträgeRow() -Methode benutzt, für Einzelaufträge aber die AddEinzelaufträgeRow().
    Ich empfehle wie gesagt, immer die Add<TypedRow>-Methode mit den vielen Parametern, weil auf diese Weise kann man keinen vergessen:

    VB.NET-Quellcode

    1. Private Sub CreateStornoFromCurrentAlleAufträge()
    2. Dim rwAuftrag = DirectCast(DirectCast(AlleaufträgeBindingSource.Current, DataRowView).Row, Gesamtaufträge.AlleaufträgeRow)
    3. Dim rwStornoAuftrag = Gesamtaufträge.Alleaufträge.AddAlleaufträgeRow(
    4. rwAuftrag.Kunde, rwAuftrag.Bauvorhaben, rwAuftrag.ANummer & " Storno!", rwAuftrag.Auftragsdatum)
    5. Dim einzelaufträgeRows = rwAuftrag.GetEinzelaufträgeRows()
    6. For Each rwEinzel In einzelaufträgeRows
    7. Gesamtaufträge.Einzelaufträge.AddEinzelaufträgeRow(
    8. parentAlleaufträgeRowByFK_Alleaufträge_Einzelaufträge:=rwStornoAuftrag,
    9. Kunde:=rwEinzel.Kunde,
    10. Bauvorhaben:=rwEinzel.Bauvorhaben,
    11. ANummer:=rwEinzel.ANummer,
    12. Pos:=rwEinzel.Pos,
    13. Leistung:=rwEinzel.Leistung,
    14. Menge:=rwEinzel.Menge,
    15. Einheit:=rwEinzel.Einheit,
    16. Einheitspreis:=rwEinzel.Einheitspreis,
    17. Skonto:=rwEinzel.Skonto,
    18. Auftragsdatum:=rwEinzel.Auftragsdatum
    19. Next
    20. End Sub
    Bei der Überarbeitung habich auch gesehen, dass du jede Property typumwandelst, also bei String überall .ToString() dranhängst, bei Double mit CDbl() konvertierst, bei Decimal mit CDec() usw..
    Typumwandlungen sind unleserlich und gefährlich.
    Mach dir klar, dass, wenn du einen Typen umwandelst, dass du dann grad nicht typisiert programmierst.
    Das typisierte am typisierten Dataset ist, dass die Spalten die richtigen Datentypen haben (die Typ-Umwandlungen hat der Designer im Hintergrund generiert - und der macht dabei keine Fehler).
    Diese typisierten Spalten nochmal umzuwandeln in den Typen, des sie eh haben ist unnütz, und fehleranfällig, weil im Gegensatz zum Designer kann dir dabei ein Fehler unterlaufen.
    Hingegen ohne selbstgebastelte TypUmwandlung sorgt der BackgroundCompiler für Sicherheit - du kannst gar keinen Wert mit dem falschen Datentypen eintragen - wird gleich rot gekringelt.

    Generell gilt: "händische Typ-Umwandlungen vermeiden, wo immer es geht!"
    Bei sauberer Programm-Architektur passen alle Typen immer genau zueinander, wie die verschiedenen Räder eines Uhrwerks.
    Es gibt nur sehr wenige Ausnahmen, wo eine händische Umwandlung leider doch erforderlich ist (etwa beim rausholen der typisierten Row aus BindingSource.Current).
    Diesem generellen Prinzip: "händische Typ-Umwandlungen vermeiden, wo immer es geht!"
    ist das typisierte Dataset gradezu gewidmet.
    Das typisierte Dataset erbt ja vom untypisierten Dataset. Und beim untypisierten Dataset muss tatsächlich jeder Wert beim Auslesen typ-gewandelt werden.
    Aber um genau das loszuwerden ist ja das typDataset erfunden worden - und man sollte es unbedingt auch so benutzen.
    Hallo EdR

    vielen Dank für deine Tips. Ja, stimmt, die Typenumwandlung benötige ich nicht. Das DataTable ist typisiert und enthält die entsprechenden Datentypen die ich benötige.
    Werde die Umwandlungen aus dem Code nehmen, weiß nicht was mich da geritten hat.

    Die NewRow-Methode kannte ich vorher schon, daher habe ich die genommen. Die Add(TypedRow) war mir bis gestern nicht bekannt, daher hatte ich auch Probleme dieses umzusetzen.
    So sieht der Code auch viel logischer aus. Danke noch mal. Ich muss noch viel lernen, bin aber dran und sehe das es mit jedem mal etwas besser wird.

    Vielen Dank