Отображение значений ComboBox в DataGridView

Приветствую.

Есть DataGridView, связанный со списком компонентов.
И в него вставляю дополнительный столбец с ComboBox:

this.typeColumn = new DataGridViewComboBoxColumn();
typeColumn.DataSource = ArtDBItem.GetTypes();
this.ArtDBView.Columns.Add(typeColumn);

И вот никак не получается сделать так, чтобы эти ComboBox содержали разные значения после инициализации формы. Предполагается, что значения берутся из элемента списка. Если выставлять вручную, то работает. Но при перезапуске приложения значения отображаемые ComboBox’ами пустые:
image
Пробовал инициализировать в событии CellFormatting. Работает только для установки одинаковых значений. Разные все также не выставляются.

private void ArtDBView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
	if (e.ColumnIndex == this.ArtDBView.Columns[this.typeColumnName].Index)
	{
        //Так работает
		e.Value = "None";		
   
        //А вот так нет
        //e.Value = this.itemList[e.RowIndex].Type;
	}
}

Есть идеи, как выставлять ComboBox различные значения?

Можно к ячейкам столбца обращаться как-то так при инициализации:

    var types = new string[] { "PDF", "HTML" };
    var typeCell = (DataGridViewComboBoxCell) ArtDBView.Rows[i].Cells[typeColumnIndex];
    typesCell.Items.AddRange(types);

Не, поскольку у typeColumn задан DataSource, то такое

не прокатит. Будет выброшено исключение. Если удалить DataSource и добавить инициализацию поля Value у DatagridViewComboBoxCell, то также при старте ничего не отображается

Так надо Items, у него Value это текущее.

Unlike the ComboBox control, the DataGridViewComboBoxCell does not have SelectedIndex and SelectedValue properties. Instead, selecting a value from a drop-down list sets the cell Value property.

Вот такой код. Эксепшен вылезает при попытке добавления в Items.

this.typeColumn.DataSource = ArtDBItem.GetTypes();
this.ArtDBView.Columns.Add(typeColumn);

for (Int32 i = 0; i < this.ArtDBView.Rows.Count - 1; i++){
	var typeCell = (DataGridViewComboBoxCell)this.ArtDBView.Rows[i].Cells[this.typeColumn.Index];
	typeCell.Items.AddRange(ArtDBItem.GetTypes()); //Exception here
}

Так тут же было про


Один DataSource не знаю можно ли фильтровать в зависимости от строки, и есть ли в этом смысл.
Можно ячейкам присваивать DataSource, а не столбцу.


Или что именно сделать надо?
Если просто иметь одинаковые списки везде и выбирать текущее значение, то просто установка Value ячейки после инициализации должно работать (если оно есть в списке, ну и если там не просто значения в массиве, то установить ValueMember и DisplayMember).

Так, разобрался.
Как это часто бывает, ошибка была в другом коде. Поле, значением которого инициализировалось значение с DataGridViewComboBoxCell становилось равным null в неожиданном месте. Поэтому не было и выбранного значения.
Алекс, спасибо за участие :slight_smile:

Код инициализации:

this.typeColumn = new DataGridViewComboBoxColumn();
this.typeColumn.DataSource = ArtDBItem.GetTypes();
this.ArtDBView.Columns.Add(this.typeColumn);

for (Int32 i = 0; i < this.ArtDBView.Rows.Count - 1; i++)
{
	var typeCell = (DataGridViewComboBoxCell)this.ArtDBView.Rows[i].Cells[this.typeColumn.Index];

	typeCell.Value = this.itemList[i].Type;
}
1 лайк