Este artigo apresenta aos leitores o controle de ligação do campo DropDownListField e as propriedades EnumDescriptionAttribute implementadas no NBear. A combinação desses dois componentes pode resolver perfeitamente o problema de vinculação do Enum aos controles de vinculação de dados do ASP.NET da maneira mais simples, fácil de usar e escalonável. [Revisão 26/05] - Adicionado suporte para descrições de enumeração de terceiros e suporte para valores de enumeração binários e de venda livre.
Pelo nome de DropDownListField, você deve ter adivinhado que, sim, o controle DropDownListField é igual ao BoundField, CheckBoxField, etc. integrado do ASP.NET e pode ser usado diretamente na declaração de GridView, DetailsView e outros controles para descrever a ligação de um campo do tipo Enum Certamente. Usando DropDownListField, não precisamos mais usar um ItemTemplate personalizado e incorporar o DropDownList para vincular um valor do tipo Enum e escrever código adicional para preencher o DropDownList no ItemTemplate.
Primeiro, vamos ver como usar o controle DropDownListField no código da nossa 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 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
4<html xmlns=" http://www.w3.org/1999/xhtml " >
5<head runat="servidor">
6 <title>Teste NBAer DataSource</title>
7</head>
8<corpo>
9<form id="aspnetForm" runat="servidor">
10 <nb:NBearDataSource ID="TestDS" runat="servidor" ConnectionStringName="banco de dados de acesso de teste"
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 <Colunas>
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 Text="BoolVal" />
19 <nb:DropDownListField DataField="Status" HeaderText="Status" SortExpression="Status" EnumType="EntityDesigns.SimpleStatus" />
20 </Colunas>
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="Nome" />
26 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" />
27 <nb:DropDownListField DataField="Status" HeaderText="Status" EnumType="EntityDesigns.SimpleStatus" />
28 </Campos>
29 </asp:DetailsView>
30</form>
31</corpo>
32</html>
Observe as linhas 2 e 19,27. Na página, primeiro registre o namespace NBear.Web.Data. Em seguida, basta adicionar DropDownListField às colunas do controle de dados. A única diferença do uso do CheckBoxField integrado do ASP.NET é que DropDownListField deve definir uma propriedade EnumType adicional. Campo Enum deste controle.
OK, é simples assim. O SimpleStatus usado nesta página é o seguinte:
1 public enum SimpleStatus
2 {
3 Valor1 = 1,
4 Valor2 = 2
5}
Se você executar esta página, verá que Valor1 e Valor2 são exibidos no DropDownList.
-Espere
1 segundo, você deve dizer, ainda não é isso que eu quero, porque a descrição do texto que preciso para exibir o valor da enumeração no DropDownList é a informação personalizada que preciso.
OK, então é a vez do segundo protagonista deste artigo-EnumDescriptionAttribute.
Basta usar EnumDescriptionAttribute para anotar Value1 e Value2 da seguinte forma:
1 public enum SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
4 Valor1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
6 Valor2 = 2
7}
OK, nenhuma configuração adicional é necessária Execute a página acima e você verá que o texto exibido no DropDownList é a informação personalizada que especificamos. Legal, não é?
-Ainda
não ficaremos satisfeitos se esperarmos mais um segundo. Embora possamos especificar informações de descrição personalizadas, se for um ambiente multilíngue, precisamos exibir informações de texto diferentes para o valor de enumeração em tempo de execução. , precisamos ler as informações de descrição da enumeração na tabela de descrição da enumeração no banco de dados.
Certamente temos uma solução para isso.
Precisamos apenas herdar EnumDescriptionAttribute. O seguinte MyEnumDescriptionAttribute demonstra uma implementação de descrição de enumeração customizada:
1 classe pública MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] customDescs = new string[] { "custom desc of Value1", null } //o segundo valor é nulo aqui para usar o DefaultDescription definido na definição de enum;
4
5 string de substituição pública GetDescription (objeto enumValue)
6 {
7 retornar customDescs[(int)enumValue] ??base.GetDescription(enumValue);
8}
9}
Esta classe sobrecarrega o método GetDescription() de EnumDescriptionAttribute para ler informações de descrição de um array na memória. Da mesma forma, também podemos ler informações descritivas de arquivos de recursos ou bancos de dados aqui. Só precisamos sobrecarregar este método.
Você deve ter notado o código de comentário. Se, para um valor de enumeração, nosso método personalizado não puder obter as informações de descrição personalizada, ele primeiro verificará se MyEnumDescriptionAttribute anotado com esse valor de enumeração é especificado, se especificado, retorna este conteúdo, caso contrário, retorna o conteúdo ToString() do valor de enumeração.
Use MyEnumDescriptionAttribute para descrever SimpleStatus da seguinte forma:
1 public enum SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="Descrição padrão do valor1")]
4 Valor1 = 1,
5 [MyEnumDescription(DefaultDescription="Descrição padrão do valor2")]
6 Valor2 = 2
7}
Execute a página novamente, você verá que as informações exibidas correspondentes ao Valor1 no DropDownList são uma descrição personalizada do Valor1, e as informações exibidas correspondentes ao Valor2 são a descrição padrão do Valor2. Por que? Como para Valor1 podemos obter as informações personalizadas retornadas por MyEnumDescriptionAttribute e para Valor2, MyEnumDescriptionAttribute retorna nulo, então as informações de descrição padrão serão aplicadas. Não é incrível?
Mesmo assim, você pode misturar e usar diferentes EnumDescriptionAttribute ou suas classes herdadas para especificar informações de descrição para diferentes itens de membros do mesmo tipo Enum (existe tal necessidade ^-^). No entanto, apenas o primeiro EnumDescriptionAttribute ou sua anotação de classe herdada terá efeito para cada item de enumeração e as anotações redundantes serão ignoradas.
Ok, a introdução básica acabou. Atrevo-me a chamar este plano de plano perfeito. :)
Além
de usar EnumDescriptionAttribute em conjunto com controles vinculados a dados, você também pode usar EnumDescriptionAttribute sozinho para obter informações de descrição de valor de enumeração de forma transparente. Chamar o método estático EnumDescriptionAttribute.GetDescriptions(enumType) pode obter as informações de descrição de todos os valores de enumeração do tipo de enumeração especificado marcados por EnumDescriptionAttribute ou sua classe herdada.
A classe DropDownListField é escrita com referência à classe CheckBoxField integrada do ASP.NET.
Baixe
todo o código-fonte e o código de amostra dos componentes apresentados neste artigo estão incluídos na versão mais recente do nbear. EnumDescriptionAttribute é definido em srcNBear.CommonEnumDescriptionAttribute.cs e DropDownListField é definido em srcNBear.Web.Data. DropDownListField. O programa de amostra está localizado em tutoriaisNBearDataSourceSample.
Ele pode ser baixado do site oficial do NBear: http://nbear.org
-
[revisão 26/05] - Adicionado suporte para descrições de enumeração de terceiros e suporte para valores de enumeração binários e de venda livre. Incluído no NBAerV3.7.1 build 7 ou superior.
1. Para tipos de enumeração em assemblies compilados de terceiros, ou seja, não temos a oportunidade de adicionar EnumDescriptionAttribute diretamente à definição de enumeração, agora é suportado. Você só precisa definir um tipo de enumeração adicional correspondente ao tipo de enumeração externa para garantir que os valores int dos itens de enumeração dos dois tipos de enumeração sejam iguais e marcar EnumDescriptionAttribute neste novo tipo de enumeração. É claro que, neste momento, o atributo EnumType precisa ser preenchido com um novo nome de tipo de enumeração.
2. Os valores de enumeração que suportam AND binário agora também são suportados sem configurações adicionais. No entanto, se a inserção e a edição deste valor de enumeração precisarem ser atualizadas para um valor mesclado, o usuário ainda precisará escrever o código para concluí-lo. Isso suporta apenas a exibição de tais valores.
//Fim deste artigo