将datagridview行移动到另一个datagridView

对于这类问题,我已经完成了其他答案,到目前为止还没有真正奏效。

我有一个foreach循环,它应该将源datagridview的行添加到目标datagridview然后从源中删除该行。

无效的操作exception是: Row provided already belongs to a DataGridView control.

我无法得到...Rows.Copy()也可以。 有任何想法吗?

 foreach (DataGridViewRow selRow in fromDataGridView.SelectedRows) { toDataGridView.Rows.Add(selRow); fromDataGridView.Rows.Remove(selRow); } 

在将其添加到toDataGridView之前,需要从fromDataGridView删除该行。

但是你正在修改foreach循环中的集合 – 这是行不通的。

解决方法是复制集合以在foreach使用。

试试这个:

 foreach (DataGridViewRow selRow in fromDataGridView.SelectedRows.OfType().ToArray()) { fromDataGridView.Rows.Remove(selRow); toDataGridView.Rows.Add(selRow); } 

以下是您可以做或尝试的示例..

当一行被删除时,它会发生行计数递减,所以如果你把你的代码放在for循环中并反向运行它会工作正常看看:

 for (int selRow = dataGridView1.Rows.Count -1; selRow >= 0 ; selRow--) { toDataGridView.Rows.Add(selRow); fromDataGridView.Rows.Remove(selRow); } 

当存在BindingSource时,无法直接向DataGridView添加新行。

您应该将行添加到第二个视图的BindingSource ,并让它将行添加到其网格中。

我在一个有效的解决方案中测试了以下代码。

 var selectedRows = dataGridView1.SelectedRows; int count = dataGridView1.SelectedRows.Count; for (int i = 0; i < count; i++) { bindingSource2.Add(bindingSource1[selectedRows[i].Index]); dataGridView1.Rows.Remove(selectedRows[i]); }