Artikel ini memperkenalkan pembaca pada kontrol pengikatan bidang DropDownListField dan properti EnumDescriptionAttribute yang diterapkan di NBear. Menggabungkan kedua komponen ini dapat dengan sempurna menyelesaikan masalah pengikatan Enum ke kontrol pengikatan data ASP.NET dengan cara yang paling sederhana, mudah digunakan, dan terukur. [Revisi 26/05] - Menambahkan dukungan untuk deskripsi enumerasi pihak ketiga dan dukungan untuk nilai enumerasi biner dan over-the-counter.
Dari nama DropDownListField, Anda pasti sudah menebaknya, ya, kontrol DropDownListField sama dengan BoundField, CheckBoxField, dll. yang ada di ASP.NET, dan dapat langsung digunakan dalam deklarasi GridView, DetailsView, dan kontrol lain untuk menjelaskan pengikatan bidang tipe Enum Tentu saja. Dengan menggunakan DropDownListField, kita tidak perlu lagi menggunakan ItemTemplate khusus dan menyematkan DropDownList untuk mengikat nilai tipe Enum, dan menulis kode tambahan untuk mengisi DropDownList di ItemTemplate.
Pertama, mari kita lihat cara menggunakan kontrol DropDownListField di kode halaman kita:
1<%@ Page Language="C#" %>
2<%@ Daftar TagPrefix="nb" Namespace="NBear.Web.Data" Majelis="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<kepala runat="server">
6 <title>Uji Sumber Data NBear</title>
7</kepala>
8<tubuh>
9<form id="aspnetForm" runat="server">
10 <nb:NBearDataSource ID="TestDS" runat="server" ConnectionStringName="uji akses 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="Benar" AutoGenerateDeleteButton="Benar" DataKeyNames="SimpleId" AutoGenerateColumns="False" >
14 <Kolom>
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 Teks="BoolVal" />
19 <nb:DropDownListField DataField="Status" HeaderText="Status" SortExpression="Status" EnumType="EntityDesigns.SimpleStatus" />
20 </Kolom>
21 </asp:Tampilan Grid>
22 <br />
23 <asp:DetailsView ID="TestDetail" runat="server" DataSourceID="TestDS" DefaultMode="Sisipkan"
24 AutoGenerateInsertButton="Benar" AutoGenerateRows="False">
25 <Bidang><asp:BoundField DataField="SimpleName" HeaderText="Nama" />
26 <asp:CheckBoxField DataField="BoolVal" HeaderText="BoolVal" />
27 <nb:DropDownListField DataField="Status" HeaderText="Status" EnumType="EntityDesigns.SimpleStatus" />
28 </Bidang>
29 </asp:Tampilan Detail>
30</bentuk>
31</tubuh>
32</html>
Harap perhatikan baris 2 dan 19,27. Di halaman tersebut, pertama-tama daftarkan namespace NBear.Web.Data. Selanjutnya, cukup tambahkan DropDownListField ke Kolom kontrol data. Satu-satunya perbedaan dari penggunaan CheckBoxField bawaan ASP.NET adalah DropDownListField harus menyetel properti EnumType tambahan Bidang enum dari kontrol ini.
Oke, sesederhana itu. SimpleStatus yang digunakan pada halaman ini adalah sebagai berikut:
1 public enum SimpleStatus
2 {
3 Nilai1 = 1,
4 Nilai2 = 2
5}
Jika Anda menjalankan halaman ini, Anda akan melihat bahwa Nilai1 dan Nilai2 ditampilkan di DropDownList.
-Tunggu
1 detik, Anda harus mengatakan, ini belum yang saya inginkan, karena deskripsi teks yang saya perlukan untuk menampilkan nilai enumerasi di DropDownList adalah informasi khusus yang saya perlukan.
Oke, giliran protagonis kedua artikel ini-EnumDescriptionAttribute.
Cukup gunakan EnumDescriptionAttribute untuk membubuhi keterangan Value1 dan Value2 sebagai berikut:
1 public enum SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
4 Nilai1 = 1,
5 [NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
6 Nilai2 = 2
7}
Oke, tidak diperlukan pengaturan tambahan. Jalankan halaman di atas dan Anda akan melihat bahwa teks yang ditampilkan di DropDownList adalah informasi khusus yang kami tentukan. Keren bukan?
-Kami
masih tidak akan puas jika menunggu beberapa detik lagi. Meskipun kami dapat menentukan informasi deskripsi khusus, jika ini adalah lingkungan multi-bahasa, kami perlu menampilkan informasi teks yang berbeda untuk nilai enumerasi saat runtime. , kita perlu membaca informasi deskripsi pencacahan dari tabel deskripsi pencacahan di database.
Kami tentu punya solusi untuk hal ini.
Kita hanya perlu mewarisi EnumDescriptionAttribute. MyEnumDescriptionAttribute berikut menunjukkan implementasi deskripsi enumerasi khusus:
1 kelas publik MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] customDescs = new string[] { "custom desc of Value1", null }; //nilai kedua adalah null di sini untuk menggunakan set DefaultDescription dalam definisi enum
4
5 string penggantian publik GetDescription (objek enumValue)
6 {
7 mengembalikan customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8}
9}
Kelas ini membebani metode GetDescription() EnumDescriptionAttribute untuk membaca informasi deskripsi dari array di memori. Demikian pula, kita juga dapat membaca informasi deskripsi dari file sumber daya atau database di sini. Kita hanya perlu membebani metode ini secara berlebihan.
Anda pasti telah memperhatikan kode komentar. Jika, untuk nilai enumerasi, metode kustom kami tidak dapat memperoleh informasi deskripsi kustom, maka metode tersebut akan memeriksa terlebih dahulu apakah MyEnumDescriptionAttribute yang dianotasi dengan nilai enumerasi ini ditentukan. jika tidak, kembalikan konten ToString() dari nilai enumerasi.
Gunakan MyEnumDescriptionAttribute untuk mendeskripsikan SimpleStatus sebagai berikut:
1 public enum SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="Deskripsi Nilai Default1")]
4 Nilai1 = 1,
5 [MyEnumDescription(DefaultDescription="Deskripsi Nilai Default2")]
6 Nilai2 = 2
7}
Jalankan kembali halaman tersebut, Anda akan melihat bahwa informasi yang ditampilkan terkait dengan Nilai1 di DropDownList adalah deskripsi khusus dari Nilai1, dan informasi yang ditampilkan terkait dengan Nilai2 adalah Desc Default dari Nilai2. Mengapa? Karena untuk Value1 kita bisa mendapatkan informasi khusus yang dikembalikan oleh MyEnumDescriptionAttribute, dan untuk Value2, MyEnumDescriptionAttribute mengembalikan null, maka informasi deskripsi default akan diterapkan. Luar biasa bukan?
Bahkan, Anda dapat mencampur dan menggunakan EnumDescriptionAttribute yang berbeda atau kelas yang diwarisinya untuk menentukan informasi deskripsi untuk item anggota berbeda dari tipe Enum yang sama (apakah diperlukan^-^). Namun, hanya EnumDescriptionAttribute pertama atau anotasi kelas warisannya yang akan berlaku untuk setiap item enumerasi, dan anotasi yang berlebihan akan diabaikan.
Oke, perkenalan dasarnya sudah selesai. Saya berani menyebut rencana ini sebagai rencana yang sempurna. :)
Selain
menggunakan EnumDescriptionAttribute bersama dengan kontrol terikat data, Anda juga dapat menggunakan EnumDescriptionAttribute sendiri untuk mendapatkan informasi deskripsi nilai enumerasi secara transparan. Memanggil metode statis EnumDescriptionAttribute.GetDescriptions(enumType) dapat memperoleh informasi deskripsi semua nilai enumerasi dari tipe enumerasi tertentu yang ditandai oleh EnumDescriptionAttribute atau kelas yang diwarisinya.
Kelas DropDownListField ditulis dengan mengacu pada kelas CheckBoxField bawaan ASP.NET.
Unduh
semua kode sumber dan kode contoh komponen yang diperkenalkan dalam artikel ini disertakan dalam versi terbaru nbear. EnumDescriptionAttribute ditentukan di srcNBear.CommonEnumDescriptionAttribute.cs, dan DropDownListField ditentukan di srcNBear.Web.Data Bidang Daftar DropDown. Contoh program terletak di tutorialNBearDataSourceSample.
Itu dapat diunduh dari situs resmi NBear: http://nbear.org
-
[revisi 05/26] - Menambahkan dukungan untuk deskripsi enumerasi pihak ketiga dan dukungan untuk nilai enumerasi biner dan over-the-counter. Termasuk dalam NBearV3.7.1 build 7 atau lebih tinggi.
1. Untuk tipe enumerasi di rakitan kompilasi pihak ketiga, artinya, kami tidak memiliki kesempatan untuk menambahkan EnumDescriptionAttribute secara langsung ke definisi enumerasi, sekarang sudah didukung. Anda hanya perlu menentukan tipe enumerasi tambahan yang sesuai dengan tipe enumerasi eksternal untuk memastikan bahwa nilai int item enumerasi dari kedua tipe enumerasi adalah sama, dan menandai EnumDescriptionAttribute dalam tipe enumerasi baru ini. Tentu saja saat ini atribut EnumType perlu diisi dengan nama tipe enumerasi yang baru.
2. Nilai enumerasi yang mendukung biner DAN kini juga didukung tanpa pengaturan tambahan. Namun, jika penyisipan dan pengeditan nilai enumerasi ini perlu diperbarui ke nilai gabungan, pengguna masih perlu menulis kode untuk menyelesaikannya. Ini hanya mendukung menampilkan nilai-nilai tersebut.
//Akhir artikel ini