DataTable auslesen und an Datagridview übergeben

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Daniel_aus_Jena.

    DataTable auslesen und an Datagridview übergeben

    Hallo zusammen,

    ich lese nun schon seit langer Zeit hier im Forum und konnte mir durch eure Hilfe schon sehr oft helfen! Heute muss ich euch jedoch mit einer Frage "belästigen", da ich einfach nicht weiter komme. Ich programmiere in VS2012 Express.
    Hintergrund: Auf einem mySQL Server habe ich in einer Tabelle mehrere Felder, die ich im Datagridview bestimmten Spalten Zuweisen möchte. Leider ist es nicht möglich, die Tabelle des mySQL Servers noch zu modifizieren (wäre wohl einfacher).

    Beispiel: mySQL Felder: Who1, Who2, Who3 sollen im Datagridview zusammen in der Spalte WHO stehen. Nachstehend mein Code.

    VB.NET-Quellcode

    1. Private Sub LoadTodo()
    2. Dim da As MySqlDataAdapter
    3. Dim dt As New DataTable
    4. Try
    5. myconn.Open()
    6. da = New MySqlDataAdapter("SELECT Who1, When1, What1, Status1, Who2, When2, What2, Status2, Who3, When3, What3, Status3 FROM tblReports WHERE SalesManager = '" & frmBackground.txtCurrentUser.Text & "'", myconn)
    7. da.Fill(dt)
    8. dgvOpenTodo.Columns.Add(0, "who")
    9. dgvOpenTodo.Columns.Add(1, "when")
    10. dgvOpenTodo.Columns.Add(1, "what")
    11. dgvOpenTodo.Columns.Add(2, "status")
    12. Dim Zeile As DataRow
    13. For I = 0 To dt.Rows.Count - 1
    14. Dim RowCount As Integer = dgvOpenTodo.RowCount - 1
    15. Zeile = dt.Rows(I)
    16. dgvOpenTodo.Rows.Add()
    17. dgvOpenTodo.BeginEdit(CBool(RowCount))
    18. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(0).ToString
    19. dgvOpenTodo.Rows(RowCount).Cells(1).Value = Zeile.Item(1).ToString
    20. dgvOpenTodo.Rows(RowCount).Cells(2).Value = Zeile.Item(2).ToString
    21. dgvOpenTodo.Rows(RowCount).Cells(3).Value = Zeile.Item(3).ToString
    22. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(4).ToString
    23. dgvOpenTodo.Rows(RowCount).Cells(1).Value = Zeile.Item(5).ToString
    24. dgvOpenTodo.Rows(RowCount).Cells(2).Value = Zeile.Item(6).ToString
    25. dgvOpenTodo.Rows(RowCount).Cells(3).Value = Zeile.Item(7).ToString
    26. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(8).ToString
    27. dgvOpenTodo.Rows(RowCount).Cells(1).Value = Zeile.Item(9).ToString
    28. dgvOpenTodo.Rows(RowCount).Cells(2).Value = Zeile.Item(10).ToString
    29. dgvOpenTodo.Rows(RowCount).Cells(3).Value = Zeile.Item(11).ToString
    30. Next
    31. dgvOpenTodo.Update()
    32. dgvOpenTodo.EndEdit()
    33. myconn.Close()
    34. Catch ex As Exception
    35. MsgBox(ex.Message)
    36. End Try
    37. End Sub


    Einen Fehler spuckt mir der Debug nicht aus. Es werden alle Datensätze im DGV durch den letzten Record überschrieben. Versuche ich:

    VB.NET-Quellcode

    1. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(4).ToString
    2. dgvOpenTodo.Rows(RowCount +1).Cells(1).Value = Zeile.Item(5).ToString
    3. dgvOpenTodo.Rows(RowCount +1).Cells(2).Value = Zeile.Item(6).ToString
    4. dgvOpenTodo.Rows(RowCount+1).Cells(3).Value = Zeile.Item(7).ToString


    funktioniert es, allerdings weder mit + 1 als auch mit +2 bekomme ich "Who3" ins DGV eingelesen.
    Vielleicht habt ihr ja einen Tipp / eine Idee für mich?

    Viele Grüße aus Jena
    Daniel

    Daniel_aus_Jena schrieb:

    Es werden alle Datensätze im DGV durch den letzten Record überschrieben.


    Du hast es doch so programmiert:

    Daniel_aus_Jena schrieb:

    VB.NET-Quellcode

    1. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(0).ToString
    2. dgvOpenTodo.Rows(RowCount).Cells(1).Value = Zeile.Item(1).ToString
    3. dgvOpenTodo.Rows(RowCount).Cells(2).Value = Zeile.Item(2).ToString
    4. dgvOpenTodo.Rows(RowCount).Cells(3).Value = Zeile.Item(3).ToString
    5. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(4).ToString
    6. dgvOpenTodo.Rows(RowCount).Cells(1).Value = Zeile.Item(5).ToString
    7. dgvOpenTodo.Rows(RowCount).Cells(2).Value = Zeile.Item(6).ToString
    8. dgvOpenTodo.Rows(RowCount).Cells(3).Value = Zeile.Item(7).ToString
    9. dgvOpenTodo.Rows(RowCount).Cells(0).Value = Zeile.Item(8).ToString
    10. dgvOpenTodo.Rows(RowCount).Cells(1).Value = Zeile.Item(9).ToString
    11. dgvOpenTodo.Rows(RowCount).Cells(2).Value = Zeile.Item(10).ToString
    12. dgvOpenTodo.Rows(RowCount).Cells(3).Value = Zeile.Item(11).ToString


    Du überschreibst die Cells 0 bis 3 mit den letzten Daten...
    D.H. mit einer For each Schleife am besten die Cells dynamisch halten? Denke eher nicht da es mit "RowCount + 1" für den zweiten Datensatz geklappt hat, nur Satz 3 nicht mehr... Ich stehe echt etwas auf dem Schlauch, sitz wahrscheinlich schon zu lange über dem Code...
    @Daniel_aus_Jena Sieh Dir mal diesen Snippet an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde es über ein typisiertes Dataset / Table lösen. Das ganz im Designer aufbauen und dort die neuen Inhalte als "Who1neu" o.ä. definieren. Dort können gleich auch die Expressions angelegt werden, mit denen die jeweiligen Feldinhalte zusammengeführt werden. Über Bindigsource dann dem DGV nur noch die benötigten Felder anzeigen lassen.
    Ich habe es hier mal abgespeckt und musste die Einzelfelder von Hand füllen, die mit einer Expression versehenen Felder werden dann vom Dataset zusammengebaut und nur angezeigt.