2012-02-13 325 views
2

我已经经历了这种问题的其他答案,到目前为止没有什么真的很好。移动datagridview行到另一个datagridView

我有一个foreach循环,应该从源头datagridview添加行至目的地datagridview然后从源中删除该行。

无效操作例外是:Row provided already belongs to a DataGridView control.

我不能让...Rows.Copy()来工作的。有任何想法吗?

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

你需要为循环而不是foreach循环做到这一点的,你需要做的次数以相反的顺序如果是有道理的.. – MethodMan 2012-02-13 17:49:29

回答

4

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

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

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

试试这个:

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

'错误“System.Windows.Forms.DataGridViewSelectedRowCollection '不包含'ToArray'的定义,并且没有找到接受'System.Windows.Forms.DataGridViewSelectedRowCollection'类型的第一个参数的扩展方法'ToArray'(你是否缺少using指令或程序集引用?)'i确实添加'使用System.Collections;' – ikathegreat 2012-02-13 18:38:15

+1

更新,你需要一个'使用System.Linq;' – 2012-02-13 19:45:17

+0

yeeeeesssssss现在它的工作谢谢。 – ikathegreat 2012-02-13 21:22:29

1

这里是你可以做的,或者尝试一个例子..

其时一列被删除的行数递减也因此,如果你把你的代码中发生for循环和反相运行,它会正常工作看看:

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

这在“添加”行失败。 “创建的副本数量必须严格为正值。”参数是计数。 – ikathegreat 2012-02-13 18:42:17

+0

这是因为selRow必须> 0 – progpow 2013-10-10 06:41:55

0

直接添加一个新行DataGridView当有BindingSource是不可能的。

您应该将行添加到第二视图的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]); 
} 
+0

如何设置/引用/更改两个datagridviews的绑定源? – ikathegreat 2012-02-13 19:27:32

+0

@ikathegreat我不明白上述评论的目的。你的网格是否连接到'BindingSource'或不? – mammadalius 2012-02-13 21:44:58

相关问题