Cet article présente aux lecteurs le contrôle de liaison de champ DropDownListField et les propriétés EnumDescriptionAttribute implémentées dans NBear. La combinaison de ces deux composants peut parfaitement résoudre le problème de la liaison d'Enum aux contrôles de liaison de données ASP.NET de la manière la plus simple, la plus simple à utiliser et la plus évolutive. [05/26 Revision] - Ajout de la prise en charge des descriptions d'énumération tierces et de la prise en charge des valeurs d'énumération binaires et en vente libre.
D'après le nom de DropDownListField, vous devez avoir deviné que, oui, le contrôle DropDownListField est le même que le BoundField, CheckBoxField, etc. intégré d'ASP.NET, et peut être directement utilisé dans la déclaration de GridView, DetailsView et d'autres contrôles pour décrire la liaison d'un champ de type Enum Certainement. En utilisant DropDownListField, nous n'avons plus besoin d'utiliser un ItemTemplate personnalisé et d'intégrer le DropDownList afin de lier une valeur de type Enum, et d'écrire du code supplémentaire pour remplir le DropDownList dans le ItemTemplate.
Voyons d’abord comment utiliser le contrôle DropDownListField dans notre code de page :
1<%@ Page Language="C#" %>
2<%@ Register 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="serveur">
6 <title>Test Nbear DataSource</title>
7
8<corps>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="tester la base de données d'accès"
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 <Colonnes>
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 Texte="BoolVal" />
19 <nb:DropDownListField DataField="Status" HeaderText="Status" SortExpression="Status" EnumType="EntityDesigns.SimpleStatus" />
20 </Colonnes>
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 </Champs>
29 </asp:DetailsView>
30</form>
31
32</html>
Veuillez noter les lignes 2 et 19,27. Dans la page, enregistrez d’abord l’espace de noms NBear.Web.Data. Ensuite, ajoutez simplement DropDownListField aux colonnes du contrôle de données. La seule différence par rapport à l'utilisation du CheckBoxField intégré d'ASP.NET est que DropDownListField doit définir une propriété EnumType supplémentaire. Comme son nom l'indique, elle est liée au type du. Champ d'énumération de ce contrôle.
OK, c'est aussi simple que ça. Le SimpleStatus utilisé dans cette page est le suivant :
1 énumération publique SimpleStatus
2 {
3 Valeur1 = 1,
4 Valeur2 = 2
5}
Si vous exécutez cette page, vous verrez que Value1 et Value2 sont affichés dans DropDownList.
-Attendez
1 seconde, vous devez dire, ce n'est pas encore ce que je veux, car la description textuelle dont j'ai besoin pour afficher la valeur d'énumération dans DropDownList est l'information personnalisée dont j'ai besoin.
OK, alors c'est au tour du deuxième protagoniste de cet article, EnumDescriptionAttribute.
Utilisez simplement EnumDescriptionAttribute pour annoter Value1 et Value2 comme suit :
1 public enum SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
4 Valeur1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc de Value2")]
6 Valeur2 = 2
7}
OK, aucun paramètre supplémentaire n'est requis. Exécutez la page ci-dessus et vous verrez que le texte affiché dans DropDownList correspond aux informations personnalisées que nous avons spécifiées. Cool, n'est-ce pas ?
-Nous
ne serons toujours pas satisfaits si nous attendons encore une seconde. Bien que nous puissions spécifier des informations de description personnalisées, s'il s'agit d'un environnement multilingue, nous devons afficher des informations textuelles différentes pour la valeur d'énumération au moment de l'exécution. , nous devons lire les informations de description de l'énumération à partir de la table de description de l'énumération dans la base de données.
Nous avons certainement une solution à cela.
Nous avons seulement besoin d'hériter d'EnumDescriptionAttribute. Le MyEnumDescriptionAttribute suivant illustre une implémentation de description d'énumération personnalisée :
1 classe publique MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] customDescs = new string[] { "custom desc of Value1", null }; //la deuxième valeur est nulle ici pour utiliser la DefaultDescription définie dans la définition d'énumération
4
5 chaîne de remplacement publique GetDescription (objet enumValue)
6 {
7 return customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8}
9}
Cette classe surcharge la méthode GetDescription() de EnumDescriptionAttribute pour lire les informations de description d'un tableau en mémoire. De même, nous pouvons également lire ici les informations de description à partir de fichiers de ressources ou de bases de données.
Vous devez avoir remarqué le code du commentaire. Si, pour une valeur d'énumération, notre méthode personnalisée ne peut pas obtenir les informations de description personnalisée, alors elle vérifiera d'abord si le MyEnumDescriptionAttribute annoté avec cette valeur d'énumération est spécifié, DefaultDescription, s'il est spécifié, renvoie ce contenu, sinon, renvoie le contenu ToString() de la valeur d'énumération.
Utilisez MyEnumDescriptionAttribute pour décrire SimpleStatus comme suit :
1 énumération publique SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="Description par défaut de Value1")]
4 Valeur1 = 1,
5 [MyEnumDescription(DefaultDescription="Description par défaut de Value2")]
6 Valeur2 = 2
7}
Exécutez à nouveau la page, vous verrez que les informations affichées correspondant à Value1 dans la DropDownList sont une description personnalisée de Value1 et que les informations affichées correspondant à Value2 sont une description par défaut de Value2. Pourquoi? Étant donné que pour Value1, nous pouvons obtenir les informations personnalisées renvoyées par MyEnumDescriptionAttribute et que pour Value2, MyEnumDescriptionAttribute renvoie null, les informations de description par défaut seront appliquées. N'est-ce pas incroyable ?
Même, vous pouvez mélanger et utiliser différents EnumDescriptionAttribute ou ses classes héritées pour spécifier des informations de description pour différents éléments membres du même type Enum (existe-t-il un tel besoin ^-^). Cependant, seule la première EnumDescriptionAttribute ou son annotation de classe héritée prendra effet pour chaque élément d'énumération, et les annotations redondantes seront ignorées.
D'accord, l'introduction de base est terminée. J'ose appeler ce plan un plan parfait. Ne jetez pas d'œufs pourris. :)
plus
d'utiliser EnumDescriptionAttribute conjointement avec des contrôles liés aux données, vous pouvez également utiliser EnumDescriptionAttribute seul pour obtenir de manière transparente des informations de description de valeur d'énumération. L'appel de la méthode statique EnumDescriptionAttribute.GetDescriptions(enumType) peut obtenir les informations de description de toutes les valeurs d'énumération du type d'énumération spécifié marqué par EnumDescriptionAttribute ou sa classe héritée.
La classe DropDownListField est écrite en référence à la classe CheckBoxField intégrée d'ASP.NET.
Téléchargez
tout le code source et les exemples de code des composants présentés dans cet article sont inclus dans la dernière version de nbear. EnumDescriptionAttribute est défini dans srcNBear.CommonEnumDescriptionAttribute.cs et DropDownListField est défini dans srcNBear.Web.Data. DropDownListField. L’exemple de programme se trouve dans tutorielsNBearDataSourceSample.
Il peut être téléchargé depuis le site officiel de Nbear : http://nbear.org
-
[05/26 revision] - Ajout de la prise en charge des descriptions d'énumération tierces et de la prise en charge des valeurs d'énumération binaires et en vente libre. Inclus dans NBearV3.7.1 build 7 ou supérieur.
1. Pour les types d'énumération dans les assemblys compilés tiers, c'est-à-dire que nous n'avons pas la possibilité d'ajouter directement EnumDescriptionAttribute à la définition d'énumération, cela est désormais pris en charge. Il vous suffit de définir un type d'énumération supplémentaire correspondant au type d'énumération externe pour vous assurer que les valeurs int des éléments d'énumération des deux types d'énumération sont égales, et de marquer l'EnumDescriptionAttribute dans ce nouveau type d'énumération. Bien entendu, à ce stade, l'attribut EnumType doit être rempli avec un nouveau nom de type d'énumération.
2. Les valeurs d'énumération prenant en charge le ET binaire sont désormais également prises en charge sans paramètres supplémentaires. Cependant, si l'insertion et la modification de cette valeur d'énumération doivent être mises à jour vers une valeur fusionnée, l'utilisateur doit toujours écrire du code pour la compléter. Cela prend uniquement en charge l'affichage de ces valeurs.
//Fin de cet article