Разработка электроники,
Систем автоматики,
Программного обеспечения
ООО "Антех ПСБ",
Санкт-Петербург
+79811865082
anteh@bk.ru
15.03.2013 Сайт https://anteh.ru
Возникла необходимость в динамическом изменении количества столбцов GridView заполняемой через ObjectDataSource. Можно использовать <таблица.Columns.Add(…)> или через jQuery, другие способы тоже найдутся. Но нужно динамически менять количество столбцов именно при использованн ObjectDataSource. В текущм случае добавление столбца ассоциировано с добавлением нового пользователя в базу данных. В контексте задачи процесс разовый, поэтому производительность подобного подхода не рассматривалась. Можно использовать, когда для некоторого объекта, нужно динамически добавлять дополнительный столбец данных.
Если в двух словах, то ObjectDataSource берёт информацию для строк GridView из публичных свойств созданных динамически экземпляров класса. Имя открытого свойства берётся в качестве названия столбца. К рассмотрению берутся только открытые свойства и то не всех типов. Подходят string, числовые, DataTime, bool -чекбоксы в ячейках не доступны для редактирования. Если тип не "понравится" ObjectDataSource, то он не будет отображён в GridView. Типы поддерживаемых открытых свойств: Empty| Object| DBNull| Boolean| Char| SByte| Byte| Int16| UInt16| Int32| UInt32| Int64| UInt64| Single| Double| Decimal| DateTime| String.
Про реализацию ObjectDataSource подробную информацию можно найти в сети. Будет приведён пример-проект VS2008 демонстрирующий использование функций/методов создания динамического класса. Для реализации динамической смены количества столбцов и названий заголовков будет использован динамически созданный класс с динамически создаваемыми публичными свойствами.
Для создания класса в момент выполнения используется System.Reflection.Emit. anteh.com.dll библиотека, содержит три нестатические функции/метода. Функции не тестировались во всех возможных вариантах использования, ежели чего не так, подправлю.
1. public Type CreateClassPublicProperties(string[] PublicPropertiesName, Type[] TypeOfProperties) -возвращает System.Type динамически определённый класс. Класс определяется только в памяти, в .dll на диск не записывается. PublicPropertiesName -имена публичных свойств или в дальнейшем названия заголовков столбцов GridView. Имена private полей соответствующих публичным свойствам начинаются с символа '_' и совпадают с public свойствами. TypeOfProperties -соответствующие типы свойств. Размерности PublicPropertiesName и TypeOfProperties должны совпадать и не быть равными 0, иначе функция вернёт null. Пример создания и инициализации экземпляра динамического класса:
|
Скриншот открытых свойств экземпляра класса, созданного динамически.
Соответствующая данным таблица:
Здесь "templ" и ссылки -созданы в визуальном редакторе штатными средствами самой GridView, остальные столбцы соответствуют открытым свойствам динамически созданного класса.
|
2. public Type EnhanceClassPublicProperties(Type ClassForInherit, string[] PublicPropertiesName, Type[] TypeOfProperties) - возвращает System.Type динамически определённый класс. Класс определяется только в памяти, в .dll на диск не записывается. ClassForInherit -класс, от которого будет унаследован динамически создаваемый класс. PublicPropertiesName -имена публичных свойств или в дальнейшем названия заголовков столбцов GridView. Имена private полей соответствующих публичным свойствам начинаются с символа '_' и совпадают с public свойствами. TypeOfProperties -соответствующие типы свойств. Размерности PublicPropertiesName и TypeOfProperties должны совпадать и не быть равными 0, иначе функция вернёт null. PublicPropertiesName и TypeOfProperties могут быть =null, тогда будет создан только потомок родительского класса. Т.е. функция позволяет создать либо динамический класс потомок, либо динамический класс потомок + заданное количество публичных свойтв. Функция не тестировалась при PublicPropertiesName и TypeOfProperties =null.
3. public Type ExtractClassPublicProperties(Type ClassForExtractPublicProperties, string[] PublicPropertiesName, Type[] TypeOfProperties, string[] SortOrder) - возвращает System.Type динамически определённый класс. Класс определяется только в памяти, в .dll на диск не записывается. ClassForExtractPublicProperties -класс, чьи публичные свойства будут добавлены в создаваемый динамический класс. Может быть равен null. PublicPropertiesName -имена публичных свойств или в дальнейшем названия заголовков столбцов GridView. Имена private полей соответствующих публичным свойствам начинаются с символа '_' и совпадают с public свойствами. TypeOfProperties -соответствующие типы свойств. Размерности PublicPropertiesName и TypeOfProperties должны совпадать и не быть равными 0, иначе функция вернёт null. PublicPropertiesName и TypeOfProperties могут быть =null, тогда в создаваемом динамическом классе будут только извлечённые из указанного класса публичные свойства. SortOrder -имена открытых свойств в порядке их следования в GridView. Для всех публичных свойств создаваемого динамического класса можно задать порядок размещения свойств и значит порядок расположения столбцов в таблице GridView. Если =null то сортировка не производится. Может содержать любое количество имён не обязательно совпадающих с существующими.
4. public NameTypeClassPublicProperty GetNameAndTypeOfClassPublicProperty(Type ClassTypeOf) -вспомогательная функция возвращает структуру, содержащую массив имён всех открытых свойств указанного класса и массив соответствующих типов свойств.
anteh.com.dll распространяется как есть, автор не несёт ответственности за последствия использования библиотеки.
Проект пример использования. VS2008 NF3.5 -примеры использования ObjectDataSource с классом заполнителем созданным динамически.