Как настроить DataGridView ComboBoxColumn с другим источником данных в каждой ячейке?
Я настраиваю 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
, но тогда списки пустые.
Как я должен делать это правильно?
Ответы
Ответ 1
Для меня работает следующее:
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" };
}
Ответ 2
Другой вариант - попробовать привязку данных на уровне строк. Попробуйте использовать событие OnRowDataBound. Затем вы можете программно установить то, что находится в поле со списком, на основе содержимого этой строки.
Конечно, это предполагает, что вы привязываете данные к сетке.