Краткий ответ: это невозможно сделать без создания столбцов вручную (и установки свойства DataPropertyName
) перед привязкой.Нет атрибута, который вы можете использовать для украшения вашего источника данных, DataGridView
просто сгенерирует DataGridViewTextBoxColumn
для каждого типа данных (кроме Boolean
, который будет преобразован в столбец флажка).Это внутреннее и неизменяемое поведение.
Лучше всего отключить AutoGenerateColumns
в сетке и написать собственный метод, который динамически генерирует соответствующие типы столбцов, возможно, на основе вашего собственного пользовательского атрибута, такого как (из вашегопример выше):
[DisplayName(@"Time"), ColumnType(typeof(DataGridViewButtonColumn))]
public DateTime TimePosted { get; set; }
Класс атрибута легко написать (просто расширьте Attribute
, добавьте поле Type
и соответствующий конструктор).В методе, который будет генерировать столбцы (непосредственно перед привязкой), вы можете использовать отражение, чтобы сканировать свойства и проверять наличие пользовательского атрибута.(BindingSource.GetItemProperties()
очень полезно для получения информации о свойствах объектов в коллекции.)
Это не самое элегантное решение (и оно углубляется в некоторые концепции промежуточного уровня), но это единственный способчтобы обойти это ограничение с помощью автоматически генерируемых столбцов в элементе управления DataGridView
.