Измените тип DataGridViewColumn с помощью AutoGenerateColumns
У меня есть запрос с использованием динамической сводной таблицы, которая вернет мне другое количество столбцов для привязки к моему DataGridView. Я использую AutoGenerateColumns = true..., который является единственным способом отображения сводных столбцов. Как я могу программно сделать некоторые из этих столбцов типа DataGridViewImageColumn? Все автоматически является DataGridViewTextBoxColumn при использовании AutoGenerateColumns. Я не могу создать эти столбцы программно (см. Ниже), потому что я не знаю, сколько столбцов будет возвращено или каковы будут имена столбцов.
DataGridViewColumn col = new DataGridViewImageColumn()
col.Name = ...
col.DataPropertyName = ...
DataGridView.Columns.Add(col)
Поскольку это создается, мне нужно что-то вроде этого:
DataGridView1.Columns[10].Type = DataGridViewImageColumn
... но я знаю, что этого не существует. Спасибо
1 ответ
Если вы используете AutoGenerateColumns
тогда вы не можете изменить их типы после привязки источника. Вы должны удалить столбец и добавить его обратно:
DataTable dt = new DataTable();
dataGridView1.DataSource = dt;
DataGridViewImageColumn imageCol = new DataGridViewImageColumn();
imageCol.Name = "target_column";
imageCol.DisplayIndex = dataGridView1.Columns["source_column"].DisplayIndex + 1;
dataGridView1.Columns.Add(imageCol);
for(int index = 0; index < dt.Rows.Count; index ++)
{
dataGridView1.Rows[index].Cells["target_column"].Value = dt.Rows[index]["source_column"];
}
dt.Columns.Remove("source_column");
РЕДАКТИРОВАТЬ:
Если вы не можете использовать имена столбцов, вы можете попробовать проверить тип данных, представленных в столбце. Но у этого решения были бы проблемы, если бы ваши столбцы содержали смешанные типы, и вам нужно было бы проверить, содержал ли источник данных данные перед его использованием:
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
if (dataGridView1.Rows[0].Cells[column.Name].Value.GetType() == typeof(System.Drawing.Bitmap)) //Or whatever type you store your image as
{
//Do the copy over
}
}