DataGridView zur Laufzeit befüllen - Spalten doppelt

  • VB.NET

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

    DataGridView zur Laufzeit befüllen - Spalten doppelt

    Hallo,

    ich brauche etwas Hilfe, weil ich gerade in einer gedanklichen Endlosschleife hänge und nicht weiterkomme.

    In meiner Anwendung möchte ich flexibel CSVs importieren können. Daher wollte ich die Möglichkeit einbauen, dass man die CSV in eine Datatable einliest, dort die Spaltenüberschriften auswertet und dann in einer Auflistung DB-Feld zu CSV-Feld flexibel auswählen kann, welche CSV-Spalte zu welchem DB-Feld gehört.

    VB.NET-Quellcode

    1. Dim filePath As String = OpenFileDialog1.FileName
    2. Using reader = New StreamReader(filePath)
    3. Dim csv = New CsvReader(reader, CultureInfo.InvariantCulture)
    4. Dim data_select As String
    5. Using dr = New CsvDataReader(csv)
    6. Dim dt = New DataTable
    7. dt.Load(dr)
    8. 'CSV in dt geladen
    9. DataGridView1.DataSource = dt
    10. '1. Zeile dt auslesen (Spaltenüberschriften)
    11. Dim csvspalten As New DataTable
    12. csvspalten.Columns.Add("ID")
    13. csvspalten.Columns.Add("Name")
    14. Dim zaehler As Integer = 0
    15. Dim row As DataRow = dt.Rows(0)
    16. 'Einzelne Spaltenüberschriften mit ID versehen und in csvspalten ablegen
    17. For Each item As DataColumn In row.Table.Columns
    18. Dim R As DataRow = csvspalten.NewRow
    19. R("ID") = zaehler + 1
    20. R("Name") = item
    21. csvspalten.Rows.Add(R)
    22. zaehler = zaehler + 1
    23. Next
    24. Dim dbfelder As New DataTable
    25. dbfelder.Columns.Add("ID")
    26. dbfelder.Columns.Add("Name")
    27. For z = 1 To 5
    28. Dim A As DataRow = dbfelder.NewRow
    29. A("ID") = z
    30. A("Name") = "DB-Feld " & CStr(z)
    31. dbfelder.Rows.Add(A)
    32. Next
    33. DataGridView3.DataSource = csvspalten
    34. Dim ComboCol As New DataGridViewComboBoxColumn
    35. Dim TeboCol As New DataGridViewTextBoxColumn
    36. DataGridView2.Columns.Add(TeboCol)
    37. With TeboCol
    38. .HeaderText = "DB-Feld"
    39. .Name = "DB"
    40. End With
    41. DataGridView2.Columns.Add(ComboCol)
    42. With ComboCol
    43. .HeaderText = "CSV-Feld"
    44. .Name = "CSV"
    45. .DataSource = csvspalten
    46. .DisplayMember = "Name"
    47. .ValueMember = "ID"
    48. End With
    49. 'DGV2 zusammenbauen
    50. Dim auswahl As New DataTable
    51. auswahl.Columns.Add("DB")
    52. auswahl.Columns.Add("CSV")
    53. For z = 1 To dbfelder.Rows.Count
    54. Dim A As DataRow = auswahl.NewRow
    55. data_select = "ID = " & CStr(z)
    56. Dim db_row As DataRow = dbfelder.Select(data_select).FirstOrDefault()
    57. A("DB") = db_row.Item("Name")
    58. A("CSV") = ""
    59. auswahl.Rows.Add(A)
    60. Next
    61. DataGridView2.DataSource = auswahl
    62. End Using
    63. End Using


    Ich habe da noch ein paar DGVs in der Form zum Visualisieren, ob das alles passt. Wichtig ist DataGridView2, da soll dann die Auswahltabelle rein.



    So sieht das Ergbnis aus. Ich habe statt 2 Spalten 4 Spalten. Irgendwie find ich nicht den Ansatz, wie ich die Datasource des DGV mit den im DGV definierten Columns verbinden kann.
    Wahrscheinlich ist es ein doofer Fehler, aber ich komm hier nicht weiter. Daher bin ich um jeden Tipp dankbar.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    @Lord Luxor Hat das DGV bereits im Designer Spalten zugewiesen bekommen?
    Nimm die mal raus.
    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!
    Was zu erwarten war, wenn ich mir an der Stelle den Code anschaue

    VB.NET-Quellcode

    1. DataGridView2.Columns.Add(ComboCol)
    2. '[…]
    3. DataGridView2.DataSource = auswahl
    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.
    Ah ja, habs kapiert.
    Ich hab jetzt nur die DT auswahl als Datasource des DGV gesetzt, aber dann kann ich wohl die Spalte mit den CSV-Felder nicht als Combobox definieren. Zumindest habe ich in anderen Foren gelesen, dass nachdem die Column im DGV gesetzt ist, kann man den ColumnType nicht mehr ändern, weil man auf diese Eigenschaft nicht zugreifen kann.

    Ich hab jetzt das Ganze nochmal umgebaut und die DT dbfelder dem DGV als Datasource zugewiesen und dann eine weitere Spalte angehängt mit der Combobox.

    VB.NET-Quellcode

    1. Dim filePath As String = OpenFileDialog1.FileName
    2. Using reader = New StreamReader(filePath)
    3. Dim csv = New CsvReader(reader, CultureInfo.InvariantCulture)
    4. Using dr = New CsvDataReader(csv)
    5. Dim dt = New DataTable
    6. dt.Load(dr)
    7. 'CSV in dt geladen
    8. DataGridView1.DataSource = dt
    9. '1. Zeile dt auslesen (Spaltenüberschriften)
    10. Dim csvspalten As New DataTable
    11. csvspalten.Columns.Add("ID")
    12. csvspalten.Columns.Add("Name")
    13. Dim zaehler As Integer = 0
    14. Dim row As DataRow = dt.Rows(0)
    15. 'Einzelne Spaltenüberschriften mit ID versehen und in csvspalten ablegen
    16. For Each item As DataColumn In row.Table.Columns
    17. Dim R As DataRow = csvspalten.NewRow
    18. R("ID") = zaehler + 1
    19. R("Name") = item
    20. csvspalten.Rows.Add(R)
    21. zaehler = zaehler + 1
    22. Next
    23. Dim dbfelder As New DataTable
    24. dbfelder.Columns.Add("Name")
    25. For z = 1 To 5
    26. Dim A As DataRow = dbfelder.NewRow
    27. A("Name") = "DB-Feld " & CStr(z)
    28. dbfelder.Rows.Add(A)
    29. Next
    30. DataGridView3.DataSource = csvspalten
    31. Dim ComboCol As New DataGridViewComboBoxColumn
    32. DataGridView2.DataSource = dbfelder
    33. DataGridView2.Columns.Add(ComboCol)
    34. With ComboCol
    35. .HeaderText = "CSV-Feld"
    36. .Name = "CSV"
    37. .DataSource = csvspalten
    38. .DisplayMember = "Name"
    39. .ValueMember = "ID"
    40. End With
    41. End Using
    42. End Using


    Optisch passt das jetzt.



    Leider kann ich jetzt die Combobox nicht mehr aufklappen.

    Ich zweifel so langsam, ob meine Idee mittels DGV abbildbar ist.

    Gruß
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Klappt bei mir.

    Der Inhalt der Datendatei:

    Quellcode

    1. Foo,Bar
    2. 1,A
    3. 2,B
    4. 3,C

    Bilder
    • Result.png

      4,77 kB, 967×165, 73 mal angesehen
    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 Hilfe. Dann hab ich wohl irgendwas an dem DGV direkt vermurkst. Das schaue ich mir nochmal an.

    EDIT: Man sollte im DGV den Haken bei "Bearbeiten" auch setzen ... :whistling:
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me