Измените тип 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
   }
}
Другие вопросы по тегам