Разработка электроники,

Систем автоматики,

Программного обеспечения

8(981)186-50-82

ООО "Антех ПСБ",
Санкт-Петербург

anteh@bk.ru

antehru@gmail.com

©

Использование ObjectDataSource для заполнения GridView. Динамическое изменение количества и названий столбцов GridView. Динамическое изменение количества публичных свойств класса, инициализированные экземпляры которого образуют строки GridView. C# GridView ObjectDataSource Reflection.Emit VS2008 NF3.5

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. Пример создания и инициализации экземпляра динамического класса:

using anteh.com; //dll содержит методы создания динамических классов
…
string[] s1 = new string[] { "pp1", "pp2", "Check", "dig", "StrRi", "DateTime", "DateTimeTick"}; //Задаём, прямо тут, имена публичных свойств динамического класса
//Из 'секретных' источников: поддерживаются: Empty|Object|DBNull|Boolean|Char|SByte|Byte|Int16|UInt16|Int32|UInt32|Int64|UInt64|Single|Double|Decimal|DateTime|String
Type[] t1 = new Type[] { typeof(string), typeof(string), typeof(bool), typeof(int), typeof(string), typeof(DateTime), typeof(System.Int64) }; //Свойства соответствующие именам открытых свойств создаваемого динамического класса
Type DynClass = new AddPublicProperties().CreateClassPublicProperties(s1, t1); //TypeOfDynClass -тип динамического класса

Скриншот открытых свойств экземпляра класса, созданного динамически.OpenPropertiesScreenShoot

Соответствующая данным таблица:GreedViewTable

Здесь "templ" и ссылки -созданы в визуальном редакторе штатными средствами самой GridView, остальные столбцы соответствуют открытым свойствам динамически созданного класса.

object ClassInstance = Activator.CreateInstance(DynClass); //Создаём экземпляр динамического класса
Type tp = ClassInstance.GetType();
tp.GetProperty("pp1").SetValue(ClassInstance, "str", null); //Инициализация ячейки строки столбца "pp1" строковым значением "str"

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 с классом заполнителем созданным динамически.

Copyright ©Новиков Алексей Александрович,

2012-2017 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru