在未绑定的DataGridView中复制和粘贴选定的行

时间:2016-09-22 18:46:34

标签: vb.net winforms visual-studio datagridview

我尝试在DataGridView属性中将ClipboardCopyMode更改为“EnableWithoutHeaderText”,但这不起作用。此外,我尝试使用下面的代码以编程方式执行此操作,但它也无法正常工作。请帮忙。

 Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    Me.DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText
End Sub

1 个答案:

答案 0 :(得分:1)

您可以使用单元格值克隆选定的行,然后可以使用InsertRange插入复制单元格。注意这种方式适用于未绑定的DataGridView,如果绑定了DataGridView,则应复制DataSource控件的记录。

<强> C#

var insertAt = 0;
var rows = dataGridView1.SelectedRows.Cast<DataGridViewRow>()
                        .OrderBy(r=>r.Index)
                        .Select(r=>{
                            var clone = r.Clone() as DataGridViewRow;
                            for (int i = 0; i < r.Cells.Count; i++)
                                clone.Cells[i].Value= r.Cells[i].Value;
                            return clone;
                        }).ToArray();
dataGridView1.Rows.InsertRange(insertAt, rows);

<强> VB

Dim insertAt = 0
Dim rows = DataGridView1.SelectedRows.Cast(Of DataGridViewRow) _
                        .OrderBy(Function(r) r.Index) _
                        .Select(Function(r)
                                    Dim clone = DirectCast(r.Clone(), DataGridViewRow)
                                    For i = 0 To r.Cells.Count - 1
                                        clone.Cells(i).Value = r.Cells(i).Value
                                    Next
                                    Return clone
                                End Function) _
                        .ToArray()
DataGridView1.Rows.InsertRange(insertAt, rows)

注意

  • DataGridView.Rows集合也有InsertCopies方法。但该方法只能复制连续的行范围。虽然上面的代码也可以复制不连续的选择。​​
  • 我使用OrderBy(r=>r.Index)按照您在网格中看到的顺序插入行,而不是选择它们的顺序。
  • DataGridViewRow.Clone方法克隆一行及其所有属性但不包含单元格值,因此我使用for循环复制了值。
  • 您可以根据上述代码创建扩展方法。它会更加可重复使用。