DataGridViewComboBoxCell не обновляет элемент списка

Я пытаюсь обновить значения в поле со списком в моем представлении данных. Звучит достаточно просто.

У меня есть несколько уже существующих строк, добавленных в мой DGV, где 2 столбца представляют собой раскрывающиеся списки. Фрагмент кода, как показано ниже, но список никогда не обновляется визуально новой категорией. Этот метод работает для других автономных полей со списком, но не для полей в datagridview.

// List<string> _mCategories
_mCategories.Add("new category");
_mCategories.Sort();

for(int i = 0; i < dgv.Rows.Count; i++)
{
    DataGridViewComboBoxCell c1 = dgv.Rows[i].Cells[4] as 
    DataGridViewComboBoxCell;

    c1.Items.Clear();
    c1.Items.AddRange(_mCategory.ToArray());
}

person megabytes    schedule 09.08.2019    source источник
comment
Привязка данных значительно уменьшит эту головную боль   -  person Caius Jard    schedule 10.08.2019
comment
Я никогда раньше не использовал привязку данных. Я посмотрел на это и работает отлично, спасибо.   -  person megabytes    schedule 15.08.2019


Ответы (1)


Я должен был дать больше информации об этом, чем просто обрывочный комментарий

В сценарии привязки данных я бы:

  • Создать новый набор данных
  • Добавьте к нему таблицу для хранения всех данных, которые вы хотите отобразить в сетке — например, адрес. Добавьте к нему два столбца int для поиска, например. AddressType, где 1 будет Work, 2 будет Home, и BuildingType, где 1 будет «многоквартирным домом» и т. д.
  • Добавьте еще две таблицы с двумя столбцами в каждой: один столбец содержит текстовую строку для отображения в списках со списком (например, «Многоквартирный дом» в списке типов зданий или «Дом» в списке типов адресов), другой столбец содержит число ( 1) вы хотите сохранить в основной таблице. Я обычно называю эти столбцы Disp и Val, потому что свойство DisplayMember комбинации будет установлено на текстовый столбец Disp, а свойство ValueMember комбинации будет установлено на Val.
  • Сохраните набор данных
  • Откройте окно источников данных в VS
  • Разверните узел набора данных, перетащите узел, представляющий основную таблицу (Адрес), на форму
  • Появляется представление сетки данных, и оно привязано к новому экземпляру набора данных через источник привязки (эти компоненты отображаются в нижней части конструктора форм — см. SomedataSet и addressBindingSource)
  • Edit the columns of the grid, change the AddressType column to be a datagridviewcombobox type
    • Set it's DataSource to be the table that holds the display/value pairs for the combo e.g. Other >> Project Data Sources >> DataSetName >> AddressType
    • Установите DisplayMember комбо в качестве строкового столбца (Disp)
    • Установите ValueMember комбо как столбец int (Val)
    • Убедитесь, что свойство DataPropertyName ссылается на имя столбца в основной сетке, содержащего тип адреса (AddressType).

Это должно быть так. Ваша комбинация будет сверяться с таблицей dataset.AddressType, чтобы получить отображаемый список, она покажет содержимое Disp и будет использовать значение, найденное в Val, для ввода в столбцы Address.AddressType или Address.BuildingType (в зависимости от того, какая комбинация это)

Добавьте некоторые данные в свою основную таблицу (не добавляйте данные в сетку; добавьте их непосредственно в таблицу данных, к которой привязана сетка) и добавьте загрузку типов адресов/типов зданий в меньшие таблицы.

Теперь, если ваша основная таблица имеет 1 в столбце типа адреса, комбинация покажет «работает». Если вы измените его на «домой», строка основной таблицы будет обновлена ​​до 2.

Я выполнил шаги здесь в видео и записал его. В какой-то момент вы увидите, как я бросаю кнопку на форму. Это просто для того, чтобы я мог щелкнуть что-то, что приведет к точке останова, а затем я могу проверить содержимое набора данных и показать вам, как это происходит.

https://youtu.be/EuHrIE3-BoE

person Caius Jard    schedule 15.08.2019