บทความนี้แนะนำให้ผู้อ่านทราบถึงการควบคุมการผูกเขตข้อมูล DropDownListField และคุณสมบัติ EnumDescriptionAttribute ที่นำไปใช้ใน Nbear การรวมสองคอมโพเนนต์เหล่านี้เข้าด้วยกันสามารถแก้ปัญหาการเชื่อมโยง Enum กับการควบคุมการเชื่อมโยงข้อมูล ASP.NET ได้อย่างสมบูรณ์แบบด้วยวิธีที่ง่ายที่สุด ใช้งานง่ายที่สุด และปรับขนาดได้ [05/26 การแก้ไข] - เพิ่มการสนับสนุนสำหรับคำอธิบายการแจงนับของบุคคลที่สามและการสนับสนุนค่าการแจงนับแบบไบนารีและแบบไม่ต้องสั่งโดยแพทย์
จากชื่อของ DropDownListField คุณต้องเดาได้เลยว่า ใช่ การควบคุม DropDownListField นั้นเหมือนกับ BoundField ในตัวของ ASP.NET, CheckBoxField ฯลฯ และสามารถนำมาใช้โดยตรงในการประกาศ GridView, DetailView และการควบคุมอื่น ๆ เพื่ออธิบาย การเชื่อมโยงฟิลด์ประเภท Enum แน่นอน เมื่อใช้ 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<หัว runat="เซิร์ฟเวอร์">
6 <title>การทดสอบแหล่งข้อมูล Nbear</title>
7</หัว>
8<ร่างกาย>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="ทดสอบการเข้าถึงฐานข้อมูล"
11 TypeName = "Entities.SimpleData" FilterExpression = "{SimpleID} > 0" DefaultOrderByExpression = "{SimpleID} DESC, {SimpleName}" />
12 <asp:GridView ID = "TestGrid" runat = "เซิร์ฟเวอร์" 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 = "สถานะ" HeaderText = "สถานะ" SortExpression = "สถานะ" EnumType = "EntityDesigns.SimpleStatus" />
20 </คอลัมน์>
21 </asp:GridView>
22 <br />
23 <asp:DetailsView ID = "TestDetail" runat = "เซิร์ฟเวอร์" DataSourceID = "TestDS" DefaultMode = "แทรก"
24 สร้างอัตโนมัติInsertButton = "จริง" สร้างอัตโนมัติแถว = "เท็จ">
25 <ฟิลด์><asp:BoundField DataField="SimpleName" HeaderText="ชื่อ" />
26 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" />
27 <nb:DropDownListField DataField = "สถานะ" HeaderText = "สถานะ" EnumType = "EntityDesigns.SimpleStatus" />
28 </ฟิลด์>
29 </asp:รายละเอียดดู>
30</รูปแบบ>
31</ร่างกาย>
32</html>
โปรดสังเกตบรรทัดที่ 2 และ 19,27 ในหน้านี้ ให้ลงทะเบียนเนมสเปซ Nbear.Web.Data ก่อน ถัดไป เพียงเพิ่ม DropDownListField ลงในคอลัมน์ของตัวควบคุมข้อมูล ข้อแตกต่างเพียงอย่างเดียวจากการใช้ CheckBoxField ในตัวของ ASP.NET คือ DropDownListField ต้องตั้งค่าคุณสมบัติ EnumType เพิ่มเติม ตามชื่อที่แนะนำ มันถูกผูกไว้กับประเภทของ ฟิลด์ Enum ของตัวควบคุมนี้
โอเค มันง่ายมาก SimpleStatus ที่ใช้ในหน้านี้มีดังนี้:
1 SimpleStatus สาธารณะ enum
2 {
3 ค่า 1 = 1,
4 ค่า2 = 2
5}
หากคุณเรียกใช้เพจนี้ คุณจะเห็นว่า Value1 และ Value2 แสดงใน DropDownList
-
รอ 1 วินาที คุณต้องบอกว่านี่ไม่ใช่สิ่งที่ฉันต้องการ เพราะคำอธิบายข้อความที่ฉันต้องแสดงค่าการแจกแจงใน DropDownList เป็นข้อมูลที่กำหนดเองที่ฉันต้องการ
ตกลง มาถึงคราวของตัวเอกคนที่สองของบทความนี้-EnumDescriptionAttribute
เพียงใช้ EnumDescriptionAttribute เพื่อใส่คำอธิบายประกอบ Value1 และ Value2 ดังนี้:
1 enum สาธารณะ SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="คำอธิบายของ Value1")]
4 ค่า 1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="คำอธิบายของ Value2")]
6 ค่า2 = 2
7}
ตกลง ไม่จำเป็นต้องตั้งค่าเพิ่มเติม เรียกใช้เพจด้านบน แล้วคุณจะเห็นว่าข้อความที่แสดงใน DropDownList เป็นข้อมูลที่กำหนดเองที่เราระบุไว้ เจ๋งใช่มั้ย?
-เรา
ยังคงไม่พอใจหากเรารออีกวินาที แม้ว่าเราจะสามารถระบุข้อมูลคำอธิบายที่กำหนดเองได้ แต่หากเป็นสภาพแวดล้อมหลายภาษา เราจำเป็นต้องแสดงข้อมูลข้อความที่แตกต่างกันสำหรับค่าการแจงนับ ณ รันไทม์ มีหลายสถานการณ์ เราจำเป็นต้องอ่านข้อมูลคำอธิบายของการแจงนับจากตารางคำอธิบายการแจงนับในฐานข้อมูล
เรามีวิธีแก้ปัญหาสำหรับเรื่องนี้อย่างแน่นอน
เราจำเป็นต้องสืบทอด EnumDescriptionAttribute เท่านั้น MyEnumDescriptionAttribute ต่อไปนี้สาธิตการใช้งานคำอธิบายการแจงนับแบบกำหนดเอง:
1 คลาสสาธารณะ MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 สตริงคงที่ส่วนตัว[] customDescs = new string[] { "custom desc of Value1", null }; // ค่าที่สองเป็น null ที่นี่เพื่อใช้ DefaultDescription ที่ตั้งค่าไว้ในคำจำกัดความ enum
4
5 สตริงแทนที่สาธารณะ GetDescription (วัตถุ enumValue)
6 {
7 ส่งคืน customDescs [(int) enumValue] ?? base.GetDescription (enumValue);
8}
9}
คลาสนี้โอเวอร์โหลดเมธอด GetDescription() ของ EnumDescriptionAttribute เพื่ออ่านข้อมูลคำอธิบายจากอาร์เรย์ในหน่วยความจำ ในทำนองเดียวกัน เรายังสามารถอ่านข้อมูลคำอธิบายจากไฟล์ทรัพยากรหรือฐานข้อมูลได้ที่นี่ เราเพียงแต่ต้องโอเวอร์โหลดวิธีนี้เท่านั้น
คุณต้องสังเกตรหัสความคิดเห็น หากวิธีการกำหนดเองของเราไม่สามารถรับข้อมูลคำอธิบายที่กำหนดเองได้ ขั้นแรกให้ตรวจสอบว่ามีการระบุ MyEnumDescriptionAttribute ที่มีคำอธิบายประกอบด้วยค่าการแจงนับนี้หรือไม่ หากระบุ จะส่งกลับเนื้อหานี้ มิฉะนั้นจะส่งคืนเนื้อหา ToString() ของค่าการแจงนับ
ใช้ MyEnumDescriptionAttribute เพื่ออธิบาย SimpleStatus ดังนี้:
1 SimpleStatus สาธารณะ enum
2 {
3 [MyEnumDescription(DefaultDescription="ค่าเริ่มต้นคำอธิบายของ Value1")]
4 ค่า 1 = 1,
5 [MyEnumDescription(DefaultDescription="ค่าเริ่มต้นคำอธิบายของ Value2")]
6 ค่า2 = 2
7}
เรียกใช้เพจอีกครั้ง คุณจะเห็นว่าข้อมูลที่แสดงสอดคล้องกับ Value1 ใน DropDownList คือ desc ที่กำหนดเองของ Value1 และข้อมูลที่แสดงซึ่งสอดคล้องกับ Value2 คือ Default Desc ของ Value2 ทำไม เนื่องจากสำหรับ Value1 เราสามารถรับข้อมูลที่กำหนดเองที่ส่งคืนโดย MyEnumDescriptionAttribute และสำหรับ Value2 นั้น MyEnumDescriptionAttribute จะส่งคืน null จากนั้นข้อมูลคำอธิบายเริ่มต้นจะถูกนำไปใช้ มันไม่น่าทึ่งเหรอ?
แม้ว่าคุณจะสามารถผสมและใช้ EnumDescriptionAttribute ที่แตกต่างกันหรือคลาสที่สืบทอดมาเพื่อระบุข้อมูลคำอธิบายสำหรับรายการสมาชิกที่แตกต่างกันของประเภท Enum เดียวกันได้ (มีความจำเป็นดังกล่าว^-^) อย่างไรก็ตาม เฉพาะ EnumDescriptionAttribute แรกหรือคำอธิบายประกอบคลาสที่สืบทอดมาเท่านั้นที่จะมีผลกับแต่ละรายการการแจงนับ และคำอธิบายประกอบที่ซ้ำซ้อนจะถูกละเว้น
โอเค การแนะนำเบื้องต้นจบลงแล้ว ฉันกล้าเรียกแผนนี้ว่าแผนสมบูรณ์แบบ แค่อย่าโยนไข่เน่าทิ้งไป -
นอกเหนือ
จากการใช้ EnumDescriptionAttribute ร่วมกับการควบคุมที่ผูกกับข้อมูลแล้ว คุณยังสามารถใช้ EnumDescriptionAttribute เพียงอย่างเดียวเพื่อรับข้อมูลคำอธิบายค่าการแจงนับอย่างโปร่งใส การเรียกเมธอดคงที่ EnumDescriptionAttribute.GetDescriptions(enumType) สามารถรับข้อมูลคำอธิบายของค่าการแจงนับทั้งหมดของประเภทการแจงนับที่ระบุที่ทำเครื่องหมายโดย EnumDescriptionAttribute หรือคลาสที่สืบทอดมา
คลาส DropDownListField ถูกเขียนโดยอ้างอิงถึงคลาส CheckBoxField ในตัวของ ASP.NET
ดาวน์โหลด
ซอร์สโค้ดและโค้ดตัวอย่างทั้งหมดของส่วนประกอบที่แนะนำในบทความนี้จะรวมอยู่ใน nbear เวอร์ชันล่าสุด ถูกกำหนดไว้ใน srcNBear.CommonEnumDescriptionAttribute.cs และ DropDownListField ถูกกำหนดไว้ใน srcNBear.Web.Data ฟิลด์รายการแบบหล่นลง โปรแกรมตัวอย่างอยู่ในบทช่วยสอนNBearDataSourceSample
สามารถดาวน์โหลดได้จากเว็บไซต์อย่างเป็นทางการของ NBear: http://nbear.org
-
[ฉบับปรับปรุง 05/26] - เพิ่มการสนับสนุนสำหรับคำอธิบายการแจงนับของบุคคลที่สาม และการสนับสนุนค่าไบนารีและค่าแจงนับที่ไม่ต้องสั่งโดยแพทย์ รวมอยู่ใน NBearV3.7.1 build 7 หรือสูงกว่า
1. สำหรับประเภทการแจงนับในแอสเซมบลีที่คอมไพล์ของบริษัทอื่น กล่าวคือ เราไม่มีโอกาสที่จะเพิ่ม EnumDescriptionAttribute โดยตรงให้กับคำจำกัดความของการแจงนับ ขณะนี้ได้รับการสนับสนุนแล้ว คุณจะต้องกำหนดประเภทการแจงนับเพิ่มเติมที่สอดคล้องกับประเภทการแจงนับภายนอกเพื่อให้แน่ใจว่าค่า int ของรายการแจงนับของประเภทการแจงนับทั้งสองนั้นเท่ากัน และทำเครื่องหมาย EnumDescriptionAttribute ในประเภทการแจงนับใหม่นี้ แน่นอนว่า ในขณะนี้ แอตทริบิวต์ EnumType จำเป็นต้องกรอกชื่อประเภทการแจงนับใหม่
2. ค่าแจงนับที่รองรับไบนารี และตอนนี้ยังรองรับโดยไม่ต้องตั้งค่าเพิ่มเติมอีกด้วย อย่างไรก็ตาม หากจำเป็นต้องอัปเดตการแทรกและแก้ไขค่าการแจงนับนี้ให้เป็นค่าที่ผสาน ผู้ใช้ยังคงต้องเขียนโค้ดเพื่อให้เสร็จสมบูรณ์ สิ่งนี้รองรับการแสดงค่าดังกล่าวเท่านั้น
//จบบทความนี้.