Началось всё с необходимости создавать свой тип ячейки заголовка колонки.
Есть для этого естественный путь
DefaultHeaderCellType.
Установить это свойство необходимо до первого обращения к
HederCell;
Казалось бы, чего проще! Перехватим
OnColumnAdded - и установим это свойство. Однако, первое обращение
HederCell через
HeaderText осуществляется в автоматическом конструкторе колонок (при наличии DataSource), и в обработчик
OnColumnAdded колонка приходит уже со стандартным заголовком — и смысла менять
DefaultHeaderCellType уже нет — надо устанавливать
HeaderCell.
Более красивым мне показалось другое решение — создание собственного наследника
DataGridViewColumn. Это решение предоставляет ещё и множество других полезностей, например, определить тип контрола для редактирования данных. А вот и сложность — автоматически (т.е. гридом) создаваться такие колонки не будут — а значит надо писать свой код для создания колонок на основе DataSource.
Я человек ленивый — поэтому полезла в исходники. Мои поиски привели меня к методу
public partial class DataGridView
{
internal class DataGridViewDataConnection
{
...
private static DataGridViewColumn GetDataGridViewColumnFromType(Type type)
{
DataGridViewColumn dataGridViewColumn;
TypeConverter imageTypeConverter = TypeDescriptor.GetConverter(typeof(Image));
if (type.Equals(typeof(bool)) || type.Equals(typeof(CheckState)))
{
dataGridViewColumn = new DataGridViewCheckBoxColumn(type.Equals(typeof(CheckState)));
}
else if (typeof(System.Drawing.Image).IsAssignableFrom(type) || imageTypeConverter.CanConvertFrom(type))
{
dataGridViewColumn = new DataGridViewImageColumn();
}
else
{
dataGridViewColumn = new DataGridViewTextBoxColumn();
}
return dataGridViewColumn;
}
...
Нет предела моему возмущению — этот метод да в класс
DataGridView, да с доступом
protected virtual - и всё нет проблем — любые пользовательские типы колонок — в режиме
AutoGenerateColumns.