1

Есть форма, на ней два 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);

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

aepot
  • 49,560
  • 1
    Добавляйте данные в DataTable или что там у вас привязано к гриду. – Alexander Petrov Jun 03 '22 at 10:53
  • Ну у меня они в DataSource передаются, или лучше в DataTable? – Андрей Павлов Jun 03 '22 at 11:05
  • 2
    Вы не можете напрямую работать с ячейками, когда используете DataSource, вам же обэтом и пишут в ошибке, редактируйте данные там, где они у вас изначально. И что это за имена Yes_white, как понять, что это? Называйте члены так, чтобы не пришлось угадывать, о чем вы думали, когда придумали это имя. – aepot Jun 03 '22 at 11:08
  • Но мне не надо их редактировать, я данные беру из реестра, я просто хочу их перенести с одной таблицы в другую, и ничего более – Андрей Павлов Jun 03 '22 at 11:12
  • Yes_white это набор программ, которые находятся в белом списке, Not_white - те что не вошли в него – Андрей Павлов Jun 03 '22 at 11:14
  • Вы в DataSource что присваиваете - то и редактируйте. Код вы не показали, гадаю на стеклянном шаре. – aepot Jun 03 '22 at 11:17
  • 1
    https://ru.stackoverflow.com/a/1412607/373567 я же вам давал уже как это делать, а вы все равно упорно пытаетесь насиловать ячейки таблицы. Зачем? – aepot Jun 03 '22 at 11:21
  • @aepot, так вы же сами говорили использовать для этого реестр, вот я и пробовал реализовать таким способом составление списка и закинуть его в отдельную ветку в реестре, и я вот столкнулся с проблемой – Андрей Павлов Jun 03 '22 at 11:24
  • Удалось разобраться? – aepot Jun 03 '22 at 11:53
  • Суть понятна, сейчас пробую сделать, но возникла проблема с переносом элемента из одного списка в другой, говорит что пространство имен не найдено, но про этом оно записано, а остальное все сделал – Андрей Павлов Jun 03 '22 at 11:56
  • Он выделяет 'FirstOrDefault()?' и говорит, что возможно нет ссылки на сборку, но в вариантах решения сам visual studio предлагает только инвертировать оператор if – Андрей Павлов Jun 03 '22 at 12:17
  • using System.Linq; в самом верху добавьте – aepot Jun 03 '22 at 12:20
  • Было написано, ошибка никуда не делась к сожалению – Андрей Павлов Jun 03 '22 at 12:29
  • Жаль рисунки сюда вставить нельзя – Андрей Павлов Jun 03 '22 at 12:30
  • @АндрейПавлов я понял свою ошибку, исправил – aepot Jun 03 '22 at 14:44
  • Удалось разобраться? – aepot Jun 03 '22 at 18:30
  • К сожалению нет, вот у меня вот такой вопрос, можно вкратце объяснить что делает вот этот кусок: 'Cast().FirstOrDefault()?.DataBoundItem is ВашТипДанных item'? – Андрей Павлов Jun 04 '22 at 14:19

1 Answers1

2

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

Берете 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);
}

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

aepot
  • 49,560
  • Я сделал программу, единственное только что, вот когда вы мне показывали код, я не совсем понял что делает там InitRegistryList, объясните пожалуйста – Андрей Павлов Jun 06 '22 at 11:10
  • @АндрейПавлов попробуйте прочитать код. Он просто создает разделы в реестре, если их нет. Возможно оно и не надо. – aepot Jun 06 '22 at 11:14
  • ну я сидел разбирался с кодом и вот и решил уточнить, просто у нас эти разделы же уже создаются и наполняются, так что зачем их по логике делать еще раз – Андрей Павлов Jun 06 '22 at 11:27
  • @АндрейПавлов возможно вы правы – aepot Jun 06 '22 at 11:33
  • Возникла проблема, я смотрел программу, и не знаю как обработать исключение "Cannot write to the registry key", возникает в 'private void AddToWhiteList(RegistryUninstallInfo info)', на строчке 'section.CreateSubKey(info.RegistryKeyName);' – Андрей Павлов Jun 06 '22 at 20:16