переместить строку 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);
}

person ikathegreat    schedule 13.02.2012    source источник
comment
вам нужно сделать это в цикле for, а не в цикле foreach, и вам нужно выполнить подсчет в обратном порядке, если это имеет смысл.   -  person MethodMan    schedule 13.02.2012


Ответы (3)


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

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

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

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

foreach (DataGridViewRow selRow in fromDataGridView.SelectedRows.OfType<DataGridViewRow>().ToArray())
{
    fromDataGridView.Rows.Remove(selRow);
    toDataGridView.Rows.Add(selRow);
}
person Roy Goode    schedule 13.02.2012
comment
Error 1 'System.Windows.Forms.DataGridViewSelectedRowCollection' does not contain a definition for 'ToArray' and no extension method 'ToArray' accepting a first argument of type 'System.Windows.Forms.DataGridViewSelectedRowCollection' could be found (are you missing a using directive or an assembly reference?) я добавил using System.Collections; - person ikathegreat; 13.02.2012
comment
Обновлено, и вам нужен using System.Linq; - person Roy Goode; 13.02.2012
comment
@RoyGoode: у меня такая ошибка: Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound. в строке toDataGridView.Rows.Add(selRow);. - person Ave; 25.07.2016
comment
@VănLộc Похоже, вы привязали данные DataGridView к объекту, такому как DataSet, DataTable, List или Dictionary. Когда вы это сделаете, вам придется управлять строками в DataGridView, манипулируя исходным объектом, который вы указали в BindingSource. - person Roy Goode; 26.07.2016

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

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

for (int selRow = dataGridView1.Rows.Count -1; selRow >= 0 ; selRow--)
{
   toDataGridView.Rows.Add(selRow);
   fromDataGridView.Rows.Remove(selRow);     
}
person MethodMan    schedule 13.02.2012
comment
это не удалось в строке Add. Количество создаваемых копий должно быть строго положительным. Параметр - количество. - person ikathegreat; 13.02.2012
comment
Это потому, что selRow должен быть › 0 - person progpow; 10.10.2013

Добавление новой строки непосредственно в 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]);
}
person mammadalius    schedule 13.02.2012
comment
как установить/сослаться/изменить источники привязки для двух представлений datagridview? - person ikathegreat; 13.02.2012
comment
@ikathegreat Я не понимаю вашей цели из комментария выше. Ваша сеть подключена к BindingSource или нет? - person mammadalius; 14.02.2012