В этой статье читатели знакомятся с элементом управления привязкой поля DropDownListField и свойствами EnumDescriptionAttribute, реализованными в NBear. Объединение этих двух компонентов может прекрасно решить проблему привязки Enum к элементам управления привязкой данных ASP.NET самым простым, легким в использовании и масштабируемым способом. [Редакция 26 мая] — Добавлена поддержка сторонних описаний перечислений, а также поддержка двоичных и безрецептурных значений перечислений.
По названию DropDownListField вы, должно быть, догадались, что да, элемент управления DropDownListField аналогичен встроенным в ASP.NET BoundField, CheckBoxField и т. д. и может напрямую использоваться в объявлении GridView, DetailsView и других элементов управления для описания привязка поля типа Enum Конечно. Используя DropDownListField, нам больше не нужно использовать собственный ItemTemplate и встраивать DropDownList для привязки значения типа Enum, а также писать дополнительный код для заполнения DropDownList в ItemTemplate.
Сначала давайте посмотрим, как использовать элемент управления DropDownListField в коде нашей страницы:
1<%@ Page Language="C#" %>
2<%@ Регистрация TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
4<html xmlns=" http://www.w3.org/1999/xhtml " >
5<head runat="сервер">
6 <title>Тест источника данных NBear</title>
7</head>
8<тело>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="тестовая база данных доступа"
11 TypeName="Entities.SimpleData" FilterExpression="{SimpleID} > 0" DefaultOrderByExpression="{SimpleID} DESC, {SimpleName}" />
12 <asp:GridView ID="TestGrid" runat="server" DataSourceID="TestDS" AllowSorting="True" AllowPaging="True"
13 PageSize="3" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" DataKeyNames="SimpleId" AutoGenerateColumns="False" >
14 <Столбцы>
15 <asp:BoundField DataField="SimpleId" HeaderText="SimpleId" SortExpression="SimpleId" />
16 <asp:BoundField DataField="SimpleName" HeaderText="SimpleName" SortExpression="SimpleName" />
17 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" SortExpression="BoolVal"
18 Текст="BoolVal" />
19 <nb:DropDownListField DataField="Status" HeaderText="Status" SortExpression="Status" EnumType="EntityDesigns.SimpleStatus" />
20 </столбцов>
21 </asp:GridView>
22 <br />
23 <asp:DetailsView ID="TestDetail" runat="server" DataSourceID="TestDS" DefaultMode="Insert"
24 AutoGenerateInsertButton="True" AutoGenerateRows="False">
25 <Fields><asp:BoundField DataField="SimpleName" HeaderText="Name" />
26 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" />
27 <nb:DropDownListField DataField="Status" HeaderText="Status" EnumType="EntityDesigns.SimpleStatus" />
28 </Поля>
29 </asp:DetailsView>
30</форма>
31</body>
32</html>
Обратите внимание на строки 2 и 19,27. На странице сначала зарегистрируйте пространство имен NBear.Web.Data. Затем просто добавьте DropDownListField к столбцам элемента управления данными. Единственное отличие от использования встроенного в ASP.NET CheckBoxField заключается в том, что DropDownListField должен установить дополнительное свойство EnumType. Как следует из названия, оно привязано к типу. Поле перечисления этого элемента управления.
Хорошо, это так просто. SimpleStatus, используемый на этой странице, выглядит следующим образом:
1 общедоступное перечисление SimpleStatus
2 {
3 Значение1 = 1,
4 Значение2 = 2
5}
Если вы запустите эту страницу, вы увидите, что Value1 и Value2 отображаются в DropDownList.
-Подождите
1 секунду, вы должны сказать, это пока не то, что я хочу, потому что текстовое описание, которое мне нужно для отображения значения перечисления в DropDownList, - это нужная мне пользовательская информация.
Хорошо, тогда настала очередь второго главного героя этой статьи — EnumDescriptionAttribute.
Просто используйте EnumDescriptionAttribute для аннотации Value1 и Value2 следующим образом:
1 общедоступное перечисление SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Описание значения1")]
4 Значение1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
6 Значение2 = 2
7}
Хорошо, никаких дополнительных настроек не требуется. Запустите страницу выше, и вы увидите, что текст, отображаемый в DropDownList, представляет собой указанную нами пользовательскую информацию. Круто, не так ли?
-Мы
все равно не будем удовлетворены, если подождем еще секунду. Хотя мы можем указать пользовательскую информацию описания, если это многоязычная среда, нам нужно отображать различную текстовую информацию для значения перечисления во время выполнения. Существует много ситуаций. , нам нужно прочитать информацию описания перечисления из таблицы описания перечисления в базе данных.
У нас определенно есть решение для этой проблемы.
Нам нужно только наследовать EnumDescriptionAttribute. Следующий MyEnumDescriptionAttribute демонстрирует реализацию пользовательского описания перечисления:
1 общедоступный класс MyEnumDescriptionAttribute: NBear.Common.EnumDescriptionAttribute
2 {
3 Private static string[] customDescs = new string[] { "custom desc of Value1", null } //второе значение здесь равно нулю, чтобы использовать DefaultDescription, установленный в определении перечисления
4
5 общедоступная строка переопределения GetDescription (объект enumValue)
6 {
7 return customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8}
9}
Этот класс перегружает метод GetDescription() класса EnumDescriptionAttribute для чтения информации описания из массива в памяти. Точно так же мы также можем прочитать здесь описание информации из файлов ресурсов или баз данных. Нам нужно только перегрузить этот метод.
Вы, должно быть, заметили код комментария. Если для значения перечисления наш пользовательский метод не может получить информацию пользовательского описания, то он сначала проверяет, указан ли атрибут MyEnumDescriptionAttribute, аннотированный этим значением перечисления, если он указан, возвращает это содержимое. в противном случае возвращает содержимое ToString() значения перечисления.
Используйте MyEnumDescriptionAttribute для описания SimpleStatus следующим образом:
1 общедоступное перечисление SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="Описание значения по умолчанию1")]
4 Значение1 = 1,
5 [MyEnumDescription(DefaultDescription="Описание значения по умолчанию2")]
6 Значение2 = 2
7}
Запустите страницу еще раз, и вы увидите, что отображаемая информация, соответствующая значению Value1 в DropDownList, является пользовательским описанием Value1, а отображаемая информация, соответствующая Value2, — это описание по умолчанию для Value2. Почему? Поскольку для Value1 мы можем получить пользовательскую информацию, возвращаемую MyEnumDescriptionAttribute, а для Value2 MyEnumDescriptionAttribute возвращает значение null, тогда будет применена информация описания по умолчанию. Разве это не удивительно?
Вы даже можете смешивать и использовать разные EnumDescriptionAttribute или его унаследованные классы для указания информации описания для разных элементов-членов одного и того же типа Enum (есть ли такая необходимость^-^). Однако для каждого элемента перечисления вступит в силу только первый EnumDescriptionAttribute или его унаследованная аннотация класса, а избыточные аннотации будут игнорироваться.
Ладно, основное введение закончено. Осмелюсь назвать этот план идеальным. Только не кидайтесь тухлыми яйцами. :)
Помимо
использования EnumDescriptionAttribute в сочетании с элементами управления с привязкой к данным, вы также можете использовать только EnumDescriptionAttribute для прозрачного получения информации описания значения перечисления. Вызов статического метода EnumDescriptionAttribute.GetDescriptions(enumType) позволяет получить информацию описания всех значений перечисления указанного типа перечисления, отмеченных EnumDescriptionAttribute или его унаследованным классом.
Класс DropDownListField написан со ссылкой на встроенный класс CheckBoxField ASP.NET.
Загрузите
весь исходный код и примеры кода компонентов, представленных в этой статье, которые включены в последнюю версию nbear. EnumDescriptionAttribute определен в srcNBear.CommonEnumDescriptionAttribute.cs, а DropDownListField определен в srcNBear.Web.Data. Поле DropDownListField. Пример программы находится в папкеtutorialsNBearDataSourceSample.
Его можно скачать с официального сайта NBear: http://nbear.org
—
[версия 26 мая] — добавлена поддержка сторонних описаний перечислений, а также поддержка двоичных и безрецептурных значений перечисления. Включено в NBearV3.7.1 сборки 7 или выше.
1. Для типов перечисления в сторонних скомпилированных сборках, то есть у нас нет возможности напрямую добавлять EnumDescriptionAttribute в определение перечисления, теперь это поддерживается. Вам нужно только определить дополнительный тип перечисления, соответствующий внешнему типу перечисления, чтобы гарантировать, что значения int элементов перечисления двух типов перечисления равны, и отметить EnumDescriptionAttribute в этом новом типе перечисления. Конечно, на данный момент атрибут EnumType необходимо заполнить новым именем типа перечисления.
2. Значения перечисления, поддерживающие двоичное И, теперь поддерживаются и без дополнительных настроек. Однако если вставку и редактирование этого значения перечисления необходимо обновить до объединенного значения, пользователю все равно придется написать код для его завершения. Это поддерживает только отображение таких значений.
//Конец этой статьи