Dieser Artikel führt Leser in die Feldbindungssteuerung DropDownListField und die in NBear implementierten EnumDescriptionAttribute-Eigenschaften ein. Durch die Kombination dieser beiden Komponenten kann das Problem der Bindung von Enum an ASP.NET-Datenbindungssteuerelemente auf einfachste, benutzerfreundlichste und skalierbarste Weise perfekt gelöst werden. [Revision 26.05.] – Unterstützung für Aufzählungsbeschreibungen von Drittanbietern und Unterstützung für binäre und rezeptfreie Aufzählungswerte hinzugefügt.
Anhand des Namens von DropDownListField müssen Sie erraten haben, dass das DropDownListField-Steuerelement mit den integrierten BoundField-, CheckBoxField- usw. von ASP.NET identisch ist und zur Beschreibung direkt in der Deklaration von GridView, DetailsView und anderen Steuerelementen verwendet werden kann die Bindung eines Feldes vom Typ Enum. Mit DropDownListField müssen wir kein benutzerdefiniertes ItemTemplate mehr verwenden und die DropDownList einbetten, um einen Wert vom Typ Enum zu binden, und keinen zusätzlichen Code schreiben, um die DropDownList im ItemTemplate zu füllen.
Sehen wir uns zunächst an, wie das DropDownListField-Steuerelement in unserem Seitencode verwendet wird:
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="server">
6 <title>NBear DataSource-Test</title>
7</head>
8<Körper>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="test access db"
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 <Spalten>
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 </Spalten>
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 </Felder>
29 </asp:DetailsView>
30</form>
31</body>
32</html>
Bitte beachten Sie die Zeilen 2 und 19,27. Registrieren Sie auf der Seite zunächst den Namespace NBear.Web.Data. Als nächstes fügen Sie einfach DropDownListField zu den Spalten des Datensteuerelements hinzu. Der einzige Unterschied zur Verwendung des in ASP.NET integrierten CheckBoxField besteht darin, dass DropDownListField eine zusätzliche EnumType-Eigenschaft festlegen muss Enum-Feld dieses Steuerelements.
Okay, so einfach ist das. Der auf dieser Seite verwendete SimpleStatus lautet wie folgt:
1 öffentliche Aufzählung SimpleStatus
2 {
3 Wert1 = 1,
4 Wert2 = 2
5}
Wenn Sie diese Seite ausführen, werden Sie sehen, dass Value1 und Value2 in der DropDownList angezeigt werden.
-Warten
Sie 1 Sekunde, Sie müssen sagen, das ist noch nicht das, was ich will, denn die Textbeschreibung, die ich brauche, um den Aufzählungswert in der DropDownList anzuzeigen, sind die benutzerdefinierten Informationen, die ich brauche.
OK, dann ist der zweite Protagonist dieses Artikels an der Reihe – EnumDescriptionAttribute.
Verwenden Sie einfach EnumDescriptionAttribute, um Value1 und Value2 wie folgt zu kommentieren:
1 öffentliche Aufzählung SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
4 Wert1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
6 Wert2 = 2
7}
OK, es sind keine zusätzlichen Einstellungen erforderlich. Sie werden sehen, dass der in der DropDownList angezeigte Text die von uns angegebenen benutzerdefinierten Informationen ist. Cool, nicht wahr?
-Wir
werden immer noch nicht zufrieden sein, wenn wir noch eine Sekunde warten. Obwohl wir benutzerdefinierte Beschreibungsinformationen angeben können, müssen wir zur Laufzeit unterschiedliche Textinformationen für den Aufzählungswert anzeigen. , müssen wir die Beschreibungsinformationen der Aufzählung aus der Aufzählungsbeschreibungstabelle in der Datenbank lesen.
Dafür haben wir auf jeden Fall eine Lösung.
Wir müssen nur EnumDescriptionAttribute erben. Das folgende MyEnumDescriptionAttribute demonstriert eine benutzerdefinierte Implementierung einer Aufzählungsbeschreibung:
1 öffentliche Klasse MyEnumDescriptionAttribute: NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] customDescs = new string[] { "custom desc of Value1", null }; //der zweite Wert ist hier null, um die in der Enum-Definition festgelegte DefaultDescription zu verwenden
4
5 öffentliche Überschreibungszeichenfolge GetDescription(object enumValue)
6 {
7 return customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8}
9}
Diese Klasse überlädt die GetDescription()-Methode von EnumDescriptionAttribute, um Beschreibungsinformationen aus einem Array im Speicher zu lesen. Ebenso können wir hier auch Beschreibungsinformationen aus Ressourcendateien oder Datenbanken lesen. Wir müssen diese Methode nur überladen.
Sie müssen den Kommentarcode bemerkt haben. Wenn unsere benutzerdefinierte Methode die benutzerdefinierten Beschreibungsinformationen nicht abrufen kann, prüft sie zunächst, ob das mit diesem Aufzählungswert versehene MyEnumDescriptionAttribute diesen Inhalt zurückgibt. Andernfalls wird der ToString()-Inhalt des Aufzählungswerts zurückgegeben.
Verwenden Sie MyEnumDescriptionAttribute, um SimpleStatus wie folgt zu beschreiben:
1 öffentliche Aufzählung SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="Default Desc of Value1")]
4 Wert1 = 1,
5 [MyEnumDescription(DefaultDescription="Default Desc of Value2")]
6 Wert2 = 2
7}
Führen Sie die Seite erneut aus. Sie werden sehen, dass die angezeigten Informationen, die Wert1 in der DropDownList entsprechen, eine benutzerdefinierte Beschreibung von Wert1 sind und die angezeigten Informationen, die Wert2 entsprechen, die Standardbeschreibung von Wert2 sind. Warum? Da wir für Wert1 die von MyEnumDescriptionAttribute zurückgegebenen benutzerdefinierten Informationen abrufen können und für Wert2 MyEnumDescriptionAttribute null zurückgibt, werden die Standardbeschreibungsinformationen angewendet. Ist es nicht erstaunlich?
Sie können sogar verschiedene EnumDescriptionAttribute oder ihre geerbten Klassen mischen und verwenden, um Beschreibungsinformationen für verschiedene Mitgliedselemente desselben Enum-Typs anzugeben (besteht eine solche Notwendigkeit^-^). Für jedes Aufzählungselement wird jedoch nur das erste EnumDescriptionAttribute oder seine geerbte Klassenanmerkung wirksam, und die redundanten Anmerkungen werden ignoriert.
Okay, die grundlegende Einführung ist vorbei. Ich wage es, diesen Plan einen perfekten Plan zu nennen. :) :)
Zusätzlich
zur Verwendung von EnumDescriptionAttribute in Verbindung mit datengebundenen Steuerelementen können Sie EnumDescriptionAttribute auch allein verwenden, um transparent Informationen zur Beschreibung des Aufzählungswerts abzurufen. Durch Aufrufen der statischen Methode EnumDescriptionAttribute.GetDescriptions(enumType) können die Beschreibungsinformationen aller Aufzählungswerte des angegebenen Aufzählungstyps abgerufen werden, der durch EnumDescriptionAttribute oder seine geerbte Klasse markiert ist.
Die DropDownListField-Klasse wird unter Bezugnahme auf die integrierte CheckBoxField-Klasse von ASP.NET geschrieben.
Laden Sie
den gesamten Quellcode und Beispielcode der in diesem Artikel vorgestellten Komponenten herunter, die in der neuesten Version von nbear enthalten sind. EnumDescriptionAttribute ist in srcNBear.CommonEnumDescriptionAttribute.cs definiert und DropDownListField ist in srcNBear.Web.Data definiert. DropDownListField. Das Beispielprogramm befindet sich unter „tutorialsNBearDataSourceSample“.
Es kann von der offiziellen Website von NBear heruntergeladen werden: http://nbear.org
–
[Revision 26.05.] – Unterstützung für Aufzählungsbeschreibungen von Drittanbietern und Unterstützung für binäre und rezeptfreie Aufzählungswerte hinzugefügt. In NBearV3.7.1 Build 7 oder höher enthalten.
1. Für Aufzählungstypen in kompilierten Assemblys von Drittanbietern haben wir nicht die Möglichkeit, EnumDescriptionAttribute direkt zur Aufzählungsdefinition hinzuzufügen. Dies wird jetzt unterstützt. Sie müssen lediglich einen zusätzlichen Aufzählungstyp definieren, der dem externen Aufzählungstyp entspricht, um sicherzustellen, dass die int-Werte der Aufzählungselemente der beiden Aufzählungstypen gleich sind, und das EnumDescriptionAttribute in diesem neuen Aufzählungstyp markieren. Zu diesem Zeitpunkt muss das EnumType-Attribut natürlich mit einem neuen Aufzählungstypnamen gefüllt werden.
2. Aufzählungswerte, die binäres UND unterstützen, werden jetzt auch ohne zusätzliche Einstellungen unterstützt. Wenn jedoch das Einfügen und Bearbeiten dieses Aufzählungswerts auf einen zusammengeführten Wert aktualisiert werden muss, muss der Benutzer noch Code schreiben, um ihn abzuschließen. Dies unterstützt nur die Anzeige solcher Werte.
//Ende dieses Artikels