Как программно преобразовать тип столбца в DataGridView C #? - PullRequest
1 голос
/ 22 октября 2010

Я динамически создал элемент управления DataGridView в форме, с источником данных, указанным как:

    ((DataGridView)createdControl).DataSource = (IList)(p.GetValue(editedClient, null));

, где IList определен как универсальная коллекция для следующего класса:

     public class CDocumentOperation

   {
        [DisplayName(@"Time")] 
        public DateTime TimePosted { get; set; }
        [DisplayName(@"User")]
        public CUser User { get; set; }
        [DisplayName(@"Action")]
        public string Action { get; set; }
    }

Сетка заполнена успешнос данными, но единственной проблемой является то, что все столбцы создаются как текстовые поля. Мне нужно вручную преобразовать столбец, который привязан к полю пользователя, чтобы иметь кнопки или ссылки (преобразовать тип столбца в DataGridViewButtonColumn).

Могу ли я сделать это, не изменяя автоматическое заполнение сетки при создании сообщения сетки, без ручного создания столбцов соответствующего типа и копирования данных?

1 Ответ

1 голос
/ 22 октября 2010

Краткий ответ: это невозможно сделать без создания столбцов вручную (и установки свойства DataPropertyName) перед привязкой.Нет атрибута, который вы можете использовать для украшения вашего источника данных, DataGridView просто сгенерирует DataGridViewTextBoxColumn для каждого типа данных (кроме Boolean, который будет преобразован в столбец флажка).Это внутреннее и неизменяемое поведение.

Лучше всего отключить AutoGenerateColumns в сетке и написать собственный метод, который динамически генерирует соответствующие типы столбцов, возможно, на основе вашего собственного пользовательского атрибута, такого как (из вашегопример выше):

[DisplayName(@"Time"), ColumnType(typeof(DataGridViewButtonColumn))] 
public DateTime TimePosted { get; set; }

Класс атрибута легко написать (просто расширьте Attribute, добавьте поле Type и соответствующий конструктор).В методе, который будет генерировать столбцы (непосредственно перед привязкой), вы можете использовать отражение, чтобы сканировать свойства и проверять наличие пользовательского атрибута.(BindingSource.GetItemProperties() очень полезно для получения информации о свойствах объектов в коллекции.)

Это не самое элегантное решение (и оно углубляется в некоторые концепции промежуточного уровня), но это единственный способчтобы обойти это ограничение с помощью автоматически генерируемых столбцов в элементе управления DataGridView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...