Este artículo presenta a los lectores el control de enlace de campo DropDownListField y las propiedades EnumDescriptionAttribute implementadas en NBear. La combinación de estos dos componentes puede resolver perfectamente el problema de vincular Enum a los controles de enlace de datos ASP.NET de la manera más simple, fácil de usar y escalable. [Revisión 26/05] - Se agregó soporte para descripciones de enumeración de terceros y soporte para valores de enumeración binarios y de venta libre.
Por el nombre de DropDownListField, debe haber adivinado que sí, el control DropDownListField es el mismo que el BoundField, CheckBoxField, etc. integrados de ASP.NET, y se puede usar directamente en la declaración de GridView, DetailsView y otros controles para describir el enlace de un campo de tipo Enum Por supuesto. Al usar DropDownListField, ya no necesitamos usar un ItemTemplate personalizado e incrustar DropDownList para vincular un valor de tipo Enum y escribir código adicional para completar DropDownList en ItemTemplate.
Primero, veamos cómo usar el control DropDownListField en el código de nuestra página:
1<%@ Page Language="C#" %>
2<%@ Registrar TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transicional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
4<html xmlns=" http://www.w3.org/1999/xhtml " >
5<cabeza runat="servidor">
6 <title>Prueba de fuente de datos Nbear</title>
7</head>
8<cuerpo>
9<formulario id="aspnetForm" runat="servidor">
10 <nb:NBearDataSource ID="TestDS" runat="servidor" ConnectionStringName="prueba de acceso a base de datos"
11 TypeName="Entidades.SimpleData" FilterExpression="{SimpleID} > 0" DefaultOrderByExpression="{SimpleID} DESC, {SimpleName}" />
12 <asp:GridView ID="TestGrid" runat="servidor" DataSourceID="TestDS" AllowSorting="True" AllowPaging="True"
13 PageSize="3" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" DataKeyNames="SimpleId" AutoGenerateColumns="False" >
14 <Columnas>
15 <asp:BoundField DataField="SimpleId" HeaderText="SimpleId" SortExpression="SimpleId" />
16 <asp:BoundField DataField="NombreSimple" HeaderText="NombreSimple" SortExpression="NombreSimple" />
17 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" SortExpression="BoolVal"
18 Texto="BoolVal" />
19 <nb:DropDownListField DataField="Estado" HeaderText="Estado" SortExpression="Estado" EnumType="EntityDesigns.SimpleStatus" />
20 </Columnas>
21</asp:GridView>
22 <br />
23 <asp:DetailsView ID="TestDetail" runat="servidor" DataSourceID="TestDS" DefaultMode="Insertar"
24 AutoGenerateInsertButton="True" AutoGenerateRows="False">
25 <Campos><asp:BoundField DataField="SimpleName" HeaderText="Nombre" />
26 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" />
27 <nb:DropDownListField DataField="Estado" HeaderText="Estado" EnumType="EntityDesigns.SimpleStatus" />
28 </Campos>
29 </asp:DetailsView>
30</formulario>
31</cuerpo>
32</html>
Tenga en cuenta las líneas 2 y 19,27. En la página, primero registre el espacio de nombres NBear.Web.Data. A continuación, simplemente agregue DropDownListField a las columnas del control de datos. La única diferencia con el uso del CheckBoxField integrado de ASP.NET es que DropDownListField debe establecer una propiedad EnumType adicional. Como sugiere el nombre, está vinculada al tipo de. Campo de enumeración de este control.
Bien, es así de simple. El SimpleStatus utilizado en esta página es el siguiente:
1 enumeración pública SimpleStatus
2 {
3 Valor1 = 1,
4 Valor2 = 2
5}
Si ejecuta esta página, verá que Valor1 y Valor2 se muestran en DropDownList.
-Espera
1 segundo, debes decir, esto no es lo que quiero todavía, porque la descripción de texto que necesito para mostrar el valor de enumeración en DropDownList es la información personalizada que necesito.
Bien, entonces es el turno del segundo protagonista de este artículo: EnumDescriptionAttribute.
Simplemente use EnumDescriptionAttribute para anotar Valor1 y Valor2 de la siguiente manera:
1 enumeración pública SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc del valor1")]
4 Valor1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc de Valor2")]
6 Valor2 = 2
7}
Bien, no se requieren configuraciones adicionales. Ejecute la página anterior y verá que el texto que se muestra en DropDownList es la información personalizada que especificamos. Genial, ¿no?
-Aún
no estaremos satisfechos si esperamos un segundo más. Aunque podemos especificar información de descripción personalizada, si se trata de un entorno multilingüe, necesitamos mostrar información de texto diferente para el valor de enumeración en tiempo de ejecución. , necesitamos leer la información de descripción de la enumeración de la tabla de descripción de enumeración en la base de datos.
Ciertamente tenemos una solución para esto.
Solo necesitamos heredar EnumDescriptionAttribute. El siguiente MyEnumDescriptionAttribute demuestra una implementación de descripción de enumeración personalizada:
1 clase pública MyEnumDescriptionAttribute: NBear.Common.EnumDescriptionAttribute
2 {
3 cadena estática privada [] customDescs = nueva cadena [] { "desc personalizada de Valor1", nulo } //el segundo valor es nulo aquí para usar la descripción predeterminada establecida en la definición de enumeración;
4
5 cadena de anulación pública GetDescription (objeto enumValue)
6 {
7 devolver customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8}
9}
Esta clase sobrecarga el método GetDescription() de EnumDescriptionAttribute para leer información de descripción de una matriz en la memoria. De manera similar, aquí también podemos leer información de descripción de archivos de recursos o bases de datos. Solo necesitamos sobrecargar este método.
Debe haber notado el código de comentario Si, para un valor de enumeración, nuestro método personalizado no puede obtener la información de descripción personalizada, primero verificará si el MyEnumDescriptionAttribute anotado con este valor de enumeración está especificado, DefaultDescription, si se especifica, devuelve este contenido. de lo contrario, devuelve el contenido ToString() del valor de enumeración.
Utilice MyEnumDescriptionAttribute para describir SimpleStatus de la siguiente manera:
1 enumeración pública SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="Descripción predeterminada del valor1")]
4 Valor1 = 1,
5 [MyEnumDescription(DefaultDescription="Descripción predeterminada del valor2")]
6 Valor2 = 2
7}
Ejecute la página nuevamente, verá que la información que se muestra correspondiente al Valor1 en DropDownList es una descripción personalizada del Valor1, y la información que se muestra correspondiente al Valor2 es la Descripción predeterminada del Valor2. ¿Por qué? Debido a que para Valor1 podemos obtener la información personalizada devuelta por MyEnumDescriptionAttribute, y para Valor2, MyEnumDescriptionAttribute devuelve nulo, entonces se aplicará la información de descripción predeterminada. ¿No es asombroso?
Incluso, puede mezclar y usar diferentes EnumDescriptionAttribute o sus clases heredadas para especificar información de descripción para diferentes elementos miembros del mismo tipo Enum (existe tal necesidad ^-^). Sin embargo, solo el primer EnumDescriptionAttribute o su anotación de clase heredada tendrá efecto para cada elemento de enumeración y las anotaciones redundantes se ignorarán.
Bien, la introducción básica ha terminado. Me atrevo a llamar a este plan un plan perfecto. Simplemente no arrojes huevos podridos. :)
Además
de utilizar EnumDescriptionAttribute junto con controles vinculados a datos, también puede utilizar EnumDescriptionAttribute solo para obtener de forma transparente información de descripción del valor de enumeración. Llamar al método estático EnumDescriptionAttribute.GetDescriptions (enumType) puede obtener la información de descripción de todos los valores de enumeración del tipo de enumeración especificado marcado por EnumDescriptionAttribute o su clase heredada.
La clase DropDownListField está escrita con referencia a la clase CheckBoxField incorporada de ASP.NET.
Descargue
todo el código fuente y el código de muestra de los componentes presentados en este artículo que se incluyen en la última versión de nbear. EnumDescriptionAttribute está definido en srcNBear.CommonEnumDescriptionAttribute.cs y DropDownListField está definido en srcNBear.Web.Data. DropDownListField. El programa de muestra se encuentra en tutorialsNBearDataSourceSample.
Se puede descargar desde el sitio web oficial de NBear: http://nbear.org
-
[revisión 26/05] - Se agregó soporte para descripciones de enumeración de terceros y soporte para valores de enumeración binarios y de venta libre. Incluido en NBearV3.7.1 compilación 7 o superior.
1. Para tipos de enumeración en ensamblados compilados por terceros, es decir, no tenemos la oportunidad de agregar EnumDescriptionAttribute directamente a la definición de enumeración, ahora es compatible. Solo necesita definir un tipo de enumeración adicional correspondiente al tipo de enumeración externo para garantizar que los valores int de los elementos de enumeración de los dos tipos de enumeración sean iguales y marcar EnumDescriptionAttribute en este nuevo tipo de enumeración. Por supuesto, en este momento, el atributo EnumType debe completarse con un nuevo nombre de tipo de enumeración.
2. Los valores de enumeración que admiten AND binario ahora también se admiten sin configuraciones adicionales. Sin embargo, si la inserción y edición de este valor de enumeración deben actualizarse a un valor combinado, el usuario aún debe escribir código para completarlo. Esto solo admite la visualización de dichos valores.
//Fin de este artículo