Как исправить ошибку «Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления привязан к данным.»?

Есть форма, на ней два DataGridView: первый берет данные из реестра и заполняется при загрузке формы, второй пустой и в него мы переносим строки из первого. При переносе с первого во второй все работает как нужно, а при переносе из второго в первый вылазит ошибка

Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления привязан к данным.

Как ее исправить? Вот сама форма: введите сюда описание изображения

Кнопка "Добавить в список" работает как надо, а вот "Удалить из списка" нет, вот ее код:

private void minus_program_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in Yes_white.SelectedRows)
        {
            object[] items = new object[row.Cells.Count];
            for (int i = 0; i < row.Cells.Count; i++)
            {
                items[i] = row.Cells[i].Value;
            }
            Not_white.Rows.Add(items);
            Yes_white.Rows.Remove(row);
        }
    }

Ошибка вылазит вот на этой строчке:

Not_white.Rows.Add(items);

Как исправить данную ошибку?


Ответы (1 шт):

Автор решения: aepot

Схематично покажу

Берете 2 листа

private readonly BindingList<ВашТипДанных> list1 = new BindingList<ВашТипДанных>();
private readonly BindingList<ВашТипДанных> list2 = new BindingList<ВашТипДанных>();

Закидываете в DataSource, можно даже в конструкторе формы однократно это сделать.

dataGridView1.DataSource = list1;
dataGridView2.DataSource = list2;

Затем заполняете их как нужно в методе загрузки данных.

Чтобы перекинуть выделенный элемент из списка 1 в список 2, достаточно сделать

if (dataGridView1.SelectedRows.Cast<DataGridViewRow>().FirstOrDefault()?.DataBoundItem is ВашТипДанных item)
{
    list1.Remove(item);
    list2.Add(item);
}

Всё, больше ничего не надо. Обратная операция выглядит точно так же.

→ Ссылка