Обновить DataSource для DataGridViewComboBox

93
10 декабря 2020, 14:00

Есть DataGridView (c# winforms vs2010 net4.0), в который добавляется строка (по одной):

private void btn_AddRow_Click(object sender, EventArgs e)
        {
            int index = dGV.Rows.Count;
            index++;
            dGV.Rows.Add();
            int nRowIndex = dGV.Rows.Count - 1;
            string[] ListGroups = listBox1.Items.OfType<string>().ToArray();
            DataGridViewComboBoxCell Col1 = (DataGridViewComboBoxCell)dGV.Rows[nRowIndex].Cells[0];
            Col1.DataSource = ListGroups;
        }

К колонке1 (Col1) привязывается список ListGroups, который формируется на основе списка контрола listBox1. В колонке1 выбрано значение. Далее я меняю (код btn_Groups_Click) содержимое списка listBox1 (например, удаляю значение-строку которая выбрана в колонке1). В результате происходит ошибка.

    private void btn_Groups_Click(object sender, EventArgs e)
            {
                Form4 frm4 = new Form4();
                if (frm4.ShowDialog(this) == DialogResult.OK)
                {
                    string[] ListGroups = frm4.ListBox2.Items.OfType<string>().ToArray();
                    listBox1.Items.Clear();
                    listBox1.Items.AddRange(ListGroups);
                    DataGridViewComboBoxColumn column1 = (DataGridViewComboBoxColumn)dGV.Columns[0];
                    column1.DataSource = null;
                    column1.DataSource = ListGroups;
                }
                frm4.Close();
                frm4.Dispose();
            }

Подскажите пожалуйста, как в таком случае удалить (возможно с оповещением пользователя что такое-то значение уже отсутствует) из колонки1 уже отсутствующее значение и выполнить перепривязку к измененному listBox1?

Answer 1

Это не ответ, потому что в вопросе недостаточно данных для него. Надеюсь, постепенно мы к нему придём.

Пока я проведу небольшой код-ревью.

В первом методе у вас есть неиспользуемая переменная index. Она создаётся, инкрементируется, но далее не используется. Можно выкинуть?

Метод DataGridView.Rows.Add() возвращает индекс добавленной строки. Логично использовать его:

int index = dGV.Rows.Add() - 1;

Нейминг. Он ужасен. Смотрите Naming Guidelines

ListGroups - переменные именуются в виде camelCase: listGroups.
Col1 - это же DataGridViewComboBoxCell - ячейка, а не колонка. Я бы назвал cell.
listBox1 - о чём говорит эта цифра 1? Ни о чём. Дайте говорящее название, что-то вроде listBoxGroups или что там у вас в этом листбоксе.

btn_AddRow - нормальное название: "Добавить строку", можно оставить.
btn_Groups - не совсем понятно, что именно делает кнопка: показывает (show), редактирует (edit), удаляет (delete/remove)? Имя должно это отражать.

Form4, frm4 - аналогично, что значит 4? Судя по коду, там идёт работа с какими-то группами. FormGroups или GroupEditingForm (форма редактирования групп), не?

column1 - я бы назвал её либо просто column, либо добавил суть: columnGroup и т. п.

В одних местах у вас используется привязка данных: DataSource = ..., в других местах работа напрямую с контролом: Items.OfType, Items.AddRange.
Правильнее было бы завести коллекцию, в которой хранятся данные. И эту коллекцию использовать и для привязки данных к GUI-контролам, и для передачи в другие методы/формы.
Удаление/добавление элементов тоже делается в этой коллеции - благодаря привязке данных изменения будут автоматически отображаться в GUI.

READ ALSO
Помощь с реализацией перегрузки метода

Помощь с реализацией перегрузки метода

До сегодня не доводилось часто сталкиваться с перегрузкой, прошу помощи с этим

108
Всем привет! Есть проблема с unity3d

Всем привет! Есть проблема с unity3d

Впервые сел за этот движок и нашел скрипт для свободной камеры, так вот мне нужно её ограничить по осям z, y, и xТк я не хочу что-бы объект вылетал...

125
Помогите с алгоритмом решения задачи

Помогите с алгоритмом решения задачи

В таблице размером 3x3, проставлены в произвольном порядке цифры от 1 до 9Требуется последовательно обойти все элементы этой таблицы таким...

126