переместить строку данных в другую строку данных - PullRequest
2 голосов
/ 13 февраля 2012

Я прошел другие ответы на этот вопрос, пока что ничего не получалось.

У меня есть цикл 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);
}

Ответы [ 3 ]

4 голосов
/ 13 февраля 2012

Вам необходимо удалить строку из fromDataGridView, прежде чем добавить ее к toDataGridView.

Но вы изменяете коллекцию внутри цикла foreach - это не сработает.

Обходной путь - скопировать коллекцию для использования в foreach.

Попробуйте это:

foreach (DataGridViewRow selRow in fromDataGridView.SelectedRows.OfType<DataGridViewRow>().ToArray())
{
    fromDataGridView.Rows.Remove(selRow);
    toDataGridView.Rows.Add(selRow);
}
1 голос
/ 13 февраля 2012

Вот пример того, что вы можете сделать или попробовать ..

это происходит, когда одна строка удаляется, число строк тоже уменьшается, так что если вы поместите свой код в цикл for и запустите его в обратном порядке, это будетотлично работают, посмотрите:

for (int selRow = dataGridView1.Rows.Count -1; selRow >= 0 ; selRow--)
{
   toDataGridView.Rows.Add(selRow);
   fromDataGridView.Rows.Remove(selRow);     
}
0 голосов
/ 13 февраля 2012

Добавление новой строки непосредственно к 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]);
}
...