تقدم هذه المقالة للقراء عنصر تحكم ربط الحقل DropDownListField وخصائص EnumDescriptionAttribute المطبقة في NBear. يمكن أن يؤدي الجمع بين هذين المكونين إلى حل مشكلة ربط Enum بعناصر تحكم ربط بيانات ASP.NET بطريقة أبسط وأسهل استخدامًا وقابلة للتطوير. [مراجعة 26/05] - تمت إضافة دعم لأوصاف التعداد الخاصة بجهات خارجية ودعم قيم التعداد الثنائية والقائمة بدون وصفة طبية.
من اسم DropDownListField، لا بد أنك خمنت أن، نعم، عنصر التحكم DropDownListField هو نفس BoundField وCheckBoxField المضمنين في ASP.NET وما إلى ذلك، ويمكن استخدامه مباشرة في إعلان GridView وDetailsView وعناصر التحكم الأخرى لوصف ربط حقل نوع التعداد بالتأكيد. باستخدام 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 <رئيس التشغيل = "الخادم">
6 <title>اختبار NBear DataSource</title>
7</الرأس>
8<الجسم>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID = "TestDS" runat = "الخادم" 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 = "صحيح" AutoGenerateRows = "خطأ">
25 <الحقول><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:عرض التفاصيل>
30</النموذج>
31</الجسم>
32</html>
يرجى ملاحظة السطرين 2 و19,27. في الصفحة، قم أولاً بتسجيل مساحة الاسم NBear.Web.Data. بعد ذلك، ما عليك سوى إضافة DropDownListField إلى أعمدة عنصر تحكم البيانات. والفرق الوحيد عن استخدام CheckBoxField المدمج في ASP.NET هو أن DropDownListField يجب أن يقوم بتعيين خاصية EnumType إضافية، كما يوحي الاسم، فهي مرتبطة بنوع حقل التعداد لعنصر التحكم هذا.
حسنًا، الأمر بهذه البساطة. SimpleStatus المستخدم في هذه الصفحة هو كما يلي:
1 التعداد العام SimpleStatus
2 {
3 القيمة1 = 1،
4 القيمة 2 = 2
5}
إذا قمت بتشغيل هذه الصفحة، فسوف ترى أنه يتم عرض Value1 وValue2 في DropDownList.
-انتظر
ثانية واحدة، يجب أن تقول، هذا ليس ما أريده بعد، لأن الوصف النصي الذي أحتاجه لعرض قيمة التعداد في DropDownList هو المعلومات المخصصة التي أحتاجها.
حسنًا، جاء دور البطل الثاني لهذه المقالة-EnumDescriptionAttribute.
ما عليك سوى استخدام EnumDescriptionAttribute لإضافة تعليقات توضيحية إلى Value1 وValue2 كما يلي:
1 تعداد عام SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
4 القيمة1 = 1،
5 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
6 القيمة 2 = 2
7}
حسنًا، لا توجد إعدادات إضافية مطلوبة. قم بتشغيل الصفحة أعلاه وسترى أن النص المعروض في DropDownList هو المعلومات المخصصة التي حددناها. رائع أليس كذلك؟
-
ما زلنا غير راضين إذا انتظرنا ثانية أخرى. على الرغم من أنه يمكننا تحديد معلومات الوصف المخصصة، إلا أننا نحتاج إلى عرض معلومات نصية مختلفة لقيمة التعداد في وقت التشغيل. ، نحتاج إلى قراءة معلومات وصف التعداد من جدول وصف التعداد في قاعدة البيانات.
بالتأكيد لدينا حل لهذا.
نحتاج فقط إلى وراثة EnumDescriptionAttribute. يوضح MyEnumDescriptionAttribute التالي تطبيق وصف التعداد المخصص:
فئة عامة واحدة MyEnumDescriptionAttribute: NBear.Common.EnumDescriptionAttribute
2 {
3 public static string[] customDescs = new string[] { "custom desc of Value1"، null }; // القيمة الثانية فارغة هنا لاستخدام مجموعة الوصف الافتراضي في تعريف التعداد
4
5 سلسلة التجاوز العامة GetDescription(object enumValue)
6 {
7 إرجاع 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 تُرجع قيمة فارغة، فسيتم تطبيق معلومات الوصف الافتراضية. أليس هذا مذهلاً؟
حتى أنه يمكنك مزج واستخدام EnumDescriptionAttribute المختلفة أو فئاتها الموروثة لتحديد معلومات الوصف لعناصر أعضاء مختلفة من نفس نوع Enum (هل هناك مثل هذه الحاجة ^-^). ومع ذلك، فإن EnumDescriptionAttribute الأولى فقط أو التعليق التوضيحي للفئة الموروثة الخاص بها سوف يسري مفعوله لكل عنصر تعداد، وسيتم تجاهل التعليقات التوضيحية الزائدة.
حسنًا، لقد انتهت المقدمة الأساسية، وأجرؤ على وصف هذه الخطة بأنها خطة مثالية. :)
بالإضافة
إلى استخدام EnumDescriptionAttribute مع عناصر التحكم المرتبطة بالبيانات، يمكنك أيضًا استخدام EnumDescriptionAttribute بمفردها للحصول على معلومات وصف قيمة التعداد بشفافية. يمكن أن يؤدي استدعاء الطريقة الثابتة EnumDescriptionAttribute.GetDescriptions(enumType) إلى الحصول على معلومات الوصف لجميع قيم التعداد لنوع التعداد المحدد الذي تم وضع علامة عليه بواسطة EnumDescriptionAttribute أو فئته الموروثة.
تتم كتابة فئة DropDownListField بالرجوع إلى فئة CheckBoxField المضمنة في ASP.NET.
تم تضمين كافة التعليمات البرمجية المصدر ونموذج التعليمات البرمجية للمكونات المقدمة في هذه المقالة في أحدث إصدار من nbear. تم تعريف EnumDescriptionAttribute في srcNBear.CommonEnumDescriptionAttribute.cs، وتم تعريف DropDownListField في srcNBear.Web.Data
.
DropDownListField. يوجد البرنامج النموذجي في TutorialNBearDataSourceSample.
يمكن تنزيله من الموقع الرسمي لـ NBear: http://nbear.org
-
[مراجعة 05/26] - تمت إضافة دعم لأوصاف التعداد الخاصة بجهات خارجية ودعم قيم التعداد الثنائية والمتاحة دون وصفة طبية. مضمن في NBearV3.7.1 الإصدار 7 أو أعلى.
1. بالنسبة لأنواع التعداد في التجميعات المترجمة لجهات خارجية، أي أنه ليس لدينا الفرصة لإضافة EnumDescriptionAttribute مباشرة إلى تعريف التعداد، فهو مدعوم الآن. ما عليك سوى تحديد نوع تعداد إضافي يتوافق مع نوع التعداد الخارجي للتأكد من أن قيم int لعناصر التعداد في نوعي التعداد متساوية، ووضع علامة على EnumDescriptionAttribute في نوع التعداد الجديد هذا. بالطبع، في هذا الوقت، يجب ملء سمة EnumType باسم نوع التعداد الجديد.
2. قيم التعداد التي تدعم النظام الثنائي أصبحت الآن مدعومة أيضًا بدون إعدادات إضافية. ومع ذلك، إذا كانت هناك حاجة إلى تحديث إدراج وتحرير قيمة التعداد هذه إلى قيمة مدمجة، فسيظل المستخدم بحاجة إلى كتابة التعليمات البرمجية لإكمالها. وهذا يدعم فقط عرض هذه القيم.
// نهاية هذه المقالة