Вопрос по c#, .net – Как настроить ComboBoxColumn DataGridView с различным источником данных в каждой ячейке?

11

Я настраиваюDataGridViewComboBoxColumn как это:

var newColumn = new DataGridViewComboBoxColumn() {
    Name = "abc"
};
newColumn.DataSource = new string[] { "a", "b", "c" }; 
dgv.Columns.Add(newColumn);

Это работает: каждая строка имеет выпадающий список в этом столбце, заполненный a, b, c.

Однако теперь я хотел бы урезать список для определенных строк. Я пытаюсь установить список для каждой строки следующим образом:

foreach (DataGridViewRow row in dgv.Rows) {
    var cell = (DataGridViewComboBoxCell)(row.Cells["abc"]);        
    cell.DataSource = new string[] { "a", "c" };                        
}

Однако этот код не имеет никакого эффекта - каждая строка по-прежнему показывает «a», «b», «c».

Я пробовал заменитьnew string[] сnew List<string> а такжеnew BindingList<string>Оба безрезультатно.

Я также попытался удалить код, который устанавливаетnewColumn.DataSource, но тогда списки пусты.

Как я должен делать это правильно?

Ваш Ответ

2   ответа
21

Следующие работы для меня:

DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn();
newColumn.Name = "abc";
newColumn.DataSource = new string[] { "a", "b", "c" };
dataGridView1.Columns.Add(newColumn);

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(row.Cells["abc"]);
    cell.DataSource = new string[] { "a", "c" };
}

Вы также можете попробовать (это также работает для меня):

for (int row = 0; row < dataGridView1.Rows.Count; row++)
{
   DataGridViewComboBoxCell cell = 
       (DataGridViewComboBoxCell)(dataGridView1.Rows[row].Cells["abc"]);
   cell.DataSource = new string[] { "f", "g" };
}
Помог мне с моей проблемой!
Хорошо, проблема была связана с тем, что в моем DataGridView AutoSizeColumnMode было установлено значение AllCells. Я думаю, это проверяло клетки ». значения до того, как их источник данных был установлен (или что-то). Blorgbeard
Хм, это работает и для меня - в чистом тестовом проекте. Это должно быть что-то, что я делаю по-другому ... Blorgbeard
0

Другой вариант - попробовать привязку данных на уровне строк. Попробуйте использовать событие OnRowDataBound. Затем вы можете программно установить, что находится в поле со списком, на основе содержимого этой строки.

Конечно, это предполагает, что вы привязываете свою сетку.

Я привязываю данные, но это winforms, а не web. В winforms datagridview, похоже, нет этого события .. Blorgbeard

Похожие вопросы