vb.netdatagridviewdatasourceduplicate-data

Duplicating Rows In DataGridView


The following code loads a tab delimited file into my DataGridView (loads 1 record from the data file). All this works perfectly, however, I need to duplicate this record X amount of times. Once the row is duplicated, I'll need to eventually edit some fields and write to a new file with the rows added.

I'v tried adding rows dynamically but it yells at me saying I can't because the data is bound.

Suggestions?

    Dim file As String = "Temp.txt"
    Dim path As String = "C:\Temp\"
    Dim ds As New DataSet
    Dim tbl As New DataTable

    Try
        If IO.File.Exists(IO.Path.Combine(path, file)) Then
            Dim ConStr As String = _
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
            path & ";Extended Properties=""Text;HDR=No;FMT=TabDelimited\"""
            Dim conn As New OleDb.OleDbConnection(ConStr)
            Dim da As New OleDb.OleDbDataAdapter("Select * from " & _
            file, conn)
            da.Fill(ds, "TextFile")
        End If
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try

    DataGridView1.DataSource = ds.Tables(0)

Solution

  • You cannot add directly to a DataGridView which is databound because the data resides elsewhere and the DGV is simply displaying what is there. To add rows to a DataTable:

    Dim dr = ds.Tables(0).NewRow()
    

    This will create a new row with the columns defined for it based on the table. Add the data for the new item to it, then add it to the table:

    dr.Item(0) = "something"   ' add to column one
    ... etc
    ds.Tables(0)Rows.Add(dr)
    

    You did not really need to create a DataSet for what you have so far. Alternative:

    Private myDT As New DataTable      
    ...
    da.Fill(myDT)
    

    To literally clone the data for a row:

    Dim dr As DataRow
    
    For n As Integer = 0 To NumberOfDuplicates
        dr = myDT.NewRow              ' new DataRow
        For c As Integer = 0 To myDT.Columns.Count - 1   ' copy data from 0 to NewRow
            dr.Item(c) = myDT.Rows(0).Item(c)
        Next
        myDT.Rows.Add(dr)            ' add NewRow to datatable
    Next n
    

    Note that you need to create a new row for each clone, the inner loop copies the data from row(0) to each new one.