Daten aus Datagridview im DataSet übernehmen bzw. überschreiben.

  • VB.NET

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

    Daten aus Datagridview im DataSet übernehmen bzw. überschreiben.

    Ausgangslage:
    Zuerst wird ein DataSet1 erstellt und durch den Adapter mit Daten aus einer Excel-Datei gefüllt. Danach wird das DataGridView1 mit disem DataSet1 gefüllt. Die Daten werden durch eine Schleife in das DataGridView2 übernommen und abgeändert. Somit hat DataGridView2 keine Verbindung.
    Frage:
    Wie ist es nun möglich die Daten aus DataGridView2 im DataSet1 zu übernehmen bzw. zu überschreiben?
    Eine Antwort: tDS und/oder DataTables leeren und neu befüllen, am besten mit DeinTds.DeineDataTable.AddDeineDataTableRow(AllDeineParameterMitTyp)
    Eine andere Möglichkeit: DGV2-Daten zurück ins DGV1 per Schleife schreiben, somit sind die Daten auch wieder im tDS. Da die Daten eh ins tDS sollen, würden bei einem tDS-Update eh die angezeigten DGV1-Daten aktualisiert werden. Oder sollen die vom DGV2 in ne eigene DataTable?
    Gegenfrage: Warum so umständlich mit 2 DGVs arbeiten und nicht gleich die Änderungen in DGV1 vornehmen? Welchen Vorteil siehst Du in dem Hantieren mit 2 DGVs? Wenn es um die Frage "Und was ist, wenn ich die Änderungen gar nicht übernehmen, sondern verwerfen will?" geht, dann schau Dir mal DataTable.AcceptChanges, .RejectChanges und Co. an.
    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 bin ganz gegen die Schleife.
    Wenn du Daten unbedingt umfüllen willst, fülle sie in DatenContainer - nicht in Controls.
    Du kannst zB eine 2. typisierte DataTable erstellen - private table2 As new Dataset1.DataTable1() und da den Kram einfüllen - DataTable hat dafür sogar eine eigene höchst leistungsfähige Methode: DataTable.Merge().
    Und mit .Merge() kriegste den Kram auch wieder zurück.
    DGV2 bindeste halt an table2, dann haste dein DGV ohne Verbindung, wenn dich das freut.



    Ah - da fällt mir ein: Wenn Leute so komische Sachen machen, ist meist gut zu erfragen, was das bezwecken soll. Oft ist der Zweck dann durchaus nachvollziehbar, und ausserdem gibts viel einfachere Wege.

    Also Frage: Was bezweckst du mit dem "DGV ohne Verbindung"?
    Vielen Dank für euere Hilfe.
    Doch wie würdet ihr nun die umständliche Sache mit den zwei DGV lösen. Denn im DGV1 befinden sich Rohdaten, welche aus Excel übernommen werden. Das DGV2 enthält andere Spalten. Zum Teil werden ganze Spalten aus dem DGV1 nicht übernommen und es kommen im DGV2 neue Spalten hinzu. Mein Ziel ist es am Ende ein DataSet zu haben, welches dem DGV2 entspricht.
    Dann stellt sich mir die Frage, wie die Daten von DGV1 nach DGV2 abgeändert werden. Werden da manuell Daten hinzugefügt? Oder aus anderen Datenquellen? Warum sollte DGV2 nicht ans tDS angebunden sein? Allerdings ist die Aussage

    DusMil schrieb:

    Mein Ziel ist es am Ende ein DataSet zu haben, welches dem DGV2 entspricht.
    insofern komisch, weil ein tDS ja viele Tabellen enthalten kann. Ein DGV primär nur eine. D.h. wohl, dass es im tDS eine Tabelle geben soll, die dem Datenbestand von DGV2 entspricht. Nun, es spricht wohl nichts dagegen, jene Tabelle mit den gewünschten Daten aus DGV1 zu füttern. Nur komm ich dann wieder auf die Frage vom Postanfang zurück: Woher kommt der Rest der Daten?
    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.
    So werden die Rohdaten in das DGV1 importiert.

    VB.NET-Quellcode

    1. MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Dateipfad + ";Extended Properties=Excel 12.0;")
    2. MyCommand = New OleDb.OleDbDataAdapter("select * from [" & TabellenName & "$]", MyConnection)
    3. MyCommand.TableMappings.Add("Table", "Table1")
    4. Dim DataSet As New System.Data.DataSet
    5. MyCommand.Fill(DataSet)t
    6. DataGridView1.DataSource = DataSet.Tables(0)
    7. MyConnection.Close()


    Danach werden die Spalten im DGV2 erstellt und formatiert.

    Und zuletzt werden die Daten aus DGV1 in DGV2 übernommen. Einige Spalten werden weggelassen und es gibt auch neue Spalten, welche sich aus den Daten aus DGV1 errechnen:

    VB.NET-Quellcode

    1. DataGridView2.Rows.Add(DataGridView1.Rows.Count)
    2. Dim textSplit() As String
    3. Dim Zeile As Integer = 0
    4. Do Until Zeile = DataGridView2.Rows.Count
    5. textSplit = Split(DataGridView1.Item(1, Zeile).Value, " ")
    6. DataGridView2.Item(0, Zeile).Value = textSplit(0)
    7. DataGridView2.Item(1, Zeile).Value = textSplit(1)
    8. DataGridView2.Item(2, Zeile).Value = DataGridView1.Item(2, Zeile).Value
    9. DataGridView2.Item(3, Zeile).Value = CDbl(DataGridView1.Item(3, Zeile).Value)
    10. DataGridView2.Item(4, Zeile).Value = DataGridView1.Item(4, Zeile).Value
    11. textSplit = Split(DataGridView1.Item(5, Zeile).Value, " ")
    12. DataGridView2.Item(5, Zeile).Value = textSplit(0)
    13. DataGridView2.Item(6, Zeile).Value = textSplit(1)
    14. DataGridView2.Item(7, Zeile).Value = CDbl(DataGridView1.Item(6, Zeile).Value)
    15. If CDbl(DataGridView1.Item(8, Zeile).Value) <= 0 Then
    16. DataGridView2.Item(8, Zeile).Value = 0
    17. Else
    18. DataGridView2.Item(8, Zeile).Value = (CDbl(DataGridView1.Item(8, Zeile).Value) - CDbl(DataGridView1.Item(7, Zeile).Value)) / CDbl(DataGridView1.Item(7, Zeile).Value)
    19. End If
    20. If CDbl(DataGridView1.Item(9, Zeile).Value) < 0 Then
    21. DataGridView2.Item(9, Zeile).Value = verloren
    22. ElseIf CDbl(DataGridView1.Item(9, Zeile).Value) = 0 Then
    23. DataGridView2.Item(9, Zeile).Value = neutral
    24. ElseIf CDbl(DataGridView1.Item(9, Zeile).Value) > 0 Then
    25. DataGridView2.Item(9, Zeile).Value = gewonnen
    26. End If
    27. DataGridView2.Item(10, Zeile).Value = Math.Abs(CDbl(DataGridView2.Item(3, Zeile).Value) - CDbl(DataGridView2.Item(7, Zeile).Value))
    28. DataGridView2.Item(11, Zeile).Value = CDate(DataGridView2.Item(6, Zeile).Value) - CDate(DataGridView2.Item(1, Zeile).Value)
    29. ToolStripProgressBar1.Value = (Zeile * progress) + 25
    30. Zeile = Zeile + 1
    31. Loop
    Wenn man vom Microsoft.VisualBasic-Namespace-Kram absieht (Split()), stellt sich mir die Frage, was das alles werden soll. Nutzt Du denn die DGVs noch für irgendwas? Also als Dateneingabe-CE oder so? Ansonsten würde ich das Ganze objektorientiert gestalten. Irgendwas wird ja mit dem DGV2 dargestellt. Eine Spielfeld? Eine Spielstatistik?
    Oder die Exceldaten hernehmen und direkt in ein bestehendes tDS einspeisen. Dazu ein tDS im Designer anlegen, ne Tabelle dazu mit all den Datentypenspalten und diese dann befüllen.
    Es ginge auch der Umweg über das im Code erstellte tDS, die Daten zu kopieren. D.h. Du nimmst Deinen ersten gezeigten Codeblock, wo Du dann eine Tabelle drin hast, die die Exceldaten enthält. Dann eine typisierte DataTable, in die Du dann die Daten einspielst. Dazu ginge der 2. Codeblock. Man muss ihn dann nur von DGV-zu-DGV auf DataTable-zu-DataTable umschreiben. Stichwort wieder: DeinTds.DeineDataTable.AddDeineDataTableRow(AllDeineParameterMitTyp)
    Vor allem wäre die direkte Einspielung in eine typisierte DataTable deshalb sinnvoll, weil Du ja im 2. Codeblock schon mit Typkonvertierung anfängst. Also scheinst Du die Daten ja in einem bestimmten Datenwertformat haben zu wollen.
    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.

    DusMil schrieb:

    DataGridView1 ,,, DataGridView2

    DusMil schrieb:

    ...zwei DGV lösen. Denn im DGV1 befinden sich Rohdaten, welche aus Excel übernommen werden. Das DGV2...

    DusMil schrieb:

    Rohdaten in das DGV1 importiert.

    DusMil schrieb:

    die Spalten im DGV2

    DusMil schrieb:

    e Daten aus DGV1 in DGV2 übernommen.

    Ich sehe dein Problem darin, dass du überhaupt nicht in Daten denkst, sondern nur in Datagridviews.
    Trenne Daten und Oberfläche - trenne das in deim Kopf!
    Und dann vergiss die Oberfläche, weil dassis pillepalle - es sind nur 3, 4 Klicks, um ein DGV an Daten anzuschliessen.



    DusMil schrieb:

    Mein Ziel ist es am Ende ein DataSet zu haben, welches dem DGV2 entspricht.
    Das ist falschrum gedacht.
    Dein Ziel muss sein, ein Dataset zu haben, wie du es brauchst.
    Daran kannste dann dein DGV2 anbinden, und das ist dann auch wie du es brauchst.

    Ein Dataset "entspricht" nicht einem DGV.
    Dataset sind die Daten, DGV ist die Anzeige der Daten - das ist Bindung, Identität - keine "Entsprechung".