2012-02-13 306 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

相關問題