DataGridView разработчики на нами издеваются?
От: fnv-hope  
Дата: 22.08.14 02:07
Оценка:
Началось всё с необходимости создавать свой тип ячейки заголовка колонки.
Есть для этого естественный путь 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.