在 DataGridView 中复制行

Posted

技术标签:

【中文标题】在 DataGridView 中复制行【英文标题】:Duplicating Rows In DataGridView 【发布时间】:2015-09-10 23:51:57 【问题描述】:

以下代码将一个制表符分隔文件加载到我的 DataGridView 中(从数据文件加载 1 条记录)。所有这一切都完美无缺,但是,我需要将此记录复制 X 次。复制行后,我最终需要编辑一些字段并写入添加了行的新文件。

我尝试动态添加行,但它对我大喊大叫说我不能,因为数据已绑定。

建议?

    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)

【问题讨论】:

将行添加到ds.Tables(0) 在加载数据之前我不知道要添加多少行。 您可以随时将行添加到 DataTable,但不能直接将它们添加到 DGV(是吗 - 文件中只有一行?) 是的,文件中只有 1 行(不包括标题)。是的,我知道你不能直接添加到网格中,数据源是需要添加的地方,这是我很难过的地方,特别是因为数据是基于按钮点击加载的。 【参考方案1】:

您不能直接添加到数据绑定的DataGridView,因为数据位于其他位置,而 DGV 只是显示那里的内容。向DataTable 添加行:

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

这将创建一个新行,其中包含基于表为其定义的列。将新项目的数据添加到其中,然后将其添加到表中:

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

到目前为止,您实际上并不需要创建DataSet。替代方案:

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

从字面上克隆一行的数据:

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

请注意,您需要为每个克隆创建一个新行,内部循环将数据从 row(0) 复制到每个新行。

【讨论】:

该文件有大量字段,100+ 并且 id 必须定义每个字段。没有办法复制整行? 我认为我对此感到非常困惑,仍然在学习绳索,并且混淆了克隆代码需要放置在与表传递到 datagridview 时的关系的位置。我需要退后一步...... 您只能在加载数据后 克隆一行。但在那之后的任何时候都可以。当您向 DT 添加行时,它们只会显示在 DGV 中 我在初始加载之前添加了 dup,这确实 dup 但是一旦初始加载完成,我不知道如何复制和重新加载。 当您添加一些克隆时,无需“重新加载”它们将显示在 DGV 中并成为数据表的一部分。如果您想在不同的时间添加,您的数据表可能应该是表单级别的变量(私有...而不是过程中的 Dim)【参考方案2】:
'Hope This helps DGV1 is the datagridview
'To copy Row
Private Sub CopyButton_Click(sender As System.Object, e As System.EventArgs) Handles CopyButton.Click
    CopyRowIndex = DGV1.CurrentRow.Index
End Sub

'To Paste Row
Private Sub PasteButton_Click(sender As System.Object, e As System.EventArgs) Handles PasteButton.Click
    PasteRowIndex = DGV1.CurrentRow.Index
    For index As Int32 = 0 To DGV1.ColumnCount - 1
        DGV1.Rows(CInt(PasteRowIndex)).Cells(index).Value = DGV1.Rows(CInt(CopyRowIndex)).Cells(index).Value
    Next

End Sub

'To Duplicate Rows
Private Sub DuplicateButton_Click(sender As System.Object, e As System.EventArgs) Handles DuplicateButton.Click
    CopyRowIndex = DGV1.CurrentRow.Index
    DGV1.Rows.Add()
    DuplicateRowIndex = DGV1.Rows.Count - 1
    For index As Int32 = 0 To DGV1.ColumnCount - 1
        DGV1.Rows(CInt(DuplicateRowIndex)).Cells(index).Value = DGV1.Rows(CInt(CopyRowIndex)).Cells(index).Value
    Next
End Sub

【讨论】:

以上是关于在 DataGridView 中复制行的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill(DataGridView.DataSource) 复制所有行

DataGridView数据绑定任意对象的数组

Form DataGridView绑定BindingSource的几种方式

如何在 dataGridView C# 中设置行颜色? [复制]

C# excel文件导入导出

DataGridView使用技巧十一:DataGridView用户输入时,单元格输入值的设定