この記事では、NBear に実装されている DropDownListField フィールド バインディング コントロールと EnumDescriptionAttribute プロパティを読者に紹介します。これら 2 つのコンポーネントを組み合わせると、Enum を ASP.NET データ バインディング コントロールにバインドする問題を、最もシンプルで使いやすく、スケーラブルな方法で完全に解決できます。 [05/26 改訂] - サードパーティの列挙記述のサポートと、バイナリおよび店頭の列挙値のサポートを追加しました。
DropDownListField の名前から、DropDownListField コントロールは ASP.NET の組み込み BoundField、CheckBoxField などと同じであり、GridView、DetailsView、およびその他のコントロールの宣言で直接使用して説明できることを推測したはずです。確かに、Enum 型フィールドのバインディング。 DropDownListField を使用すると、カスタムの ItemTemplate を使用して DropDownList を埋め込んで Enum 型の値をバインドしたり、ItemTemplate の DropDownList を埋めるための追加のコードを記述する必要がなくなりました。
まず、ページ コードで DropDownListField コントロールを使用する方法を見てみましょう。
1<%@ Page Language="C#" %>
2<%@ 登録 TagPrefix="nb" 名前空間="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="サーバー">
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="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="ステータス" HeaderText="ステータス" SortExpression="ステータス" EnumType="EntityDesigns.SimpleStatus" />
20 </コラム>
21 </asp:GridView>
22<br />
23 <asp:DetailsView ID="TestDetail" runat="サーバー" DataSourceID="TestDS" DefaultMode="挿入"
24 AutoGenerateInsertButton="True" AutoGenerateRows="False">
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</form>
31</body>
32</html>
2 行目と 19、27 行目に注目してください。このページでは、まず NBear.Web.Data 名前空間を登録します。次に、DropDownListField をデータ コントロールの列に追加するだけです。ASP.NET の組み込み CheckBoxField の使用との唯一の違いは、DropDownListField が追加の EnumType プロパティを設定する必要があることです。このコントロールの列挙型フィールド。
はい、とても簡単です。このページで使用される SimpleStatus は次のとおりです:
1 public enum SimpleStatus
2 {
3 値 1 = 1、
4 値 2 = 2
5}
このページを実行すると、Value1 と Value2 が DropDownList に表示されることがわかります。
待っ
てください。これはまだ私が望んでいることではありません。DropDownList に列挙値を表示するために必要なテキストの説明が必要なカスタム情報であるためです。
さて、次はこの記事の 2 番目の主人公である EnumDescriptionAttribute の番です。
次のように、EnumDescriptionAttribute を使用して Value1 と Value2 に注釈を付けるだけです。
1 public enum SimpleStatus
2 {
3 [NBear.Common.EnumDescription(DefaultDescription="値1の説明")]
4 値 1 = 1、
5 [NBear.Common.EnumDescription(DefaultDescription="値2の説明")]
6 値 2 = 2
7}
OK、追加の設定は必要ありません。上記のページを実行すると、DropDownList に表示されるテキストが指定したカスタム情報であることがわかります。クールですね?
-
もうちょっと待っても満足できない、データベース内の列挙型記述テーブルから列挙型の記述情報を読み取る必要があります。
私たちはこれに対する解決策を確かに持っています。
EnumDescriptionAttribute を継承するだけで済みます。次の MyEnumDescriptionAttribute は、カスタム列挙記述の実装を示しています。
1 public class MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] CustomDescs = new string[] { "custom desc of Value1", null }; // enum 定義で設定された DefaultDescription を使用するため、2 番目の値は null です。
4
5 パブリックオーバーライド文字列 GetDescription(object enumValue)
6 {
7 returncustomDescs[(int)enumValue] ??base.GetDescription(enumValue);
8}
9}
このクラスは、EnumDescriptionAttribute の GetDescription() メソッドをオーバーロードして、メモリ内の配列から説明情報を読み取ります。同様に、このメソッドをオーバーロードするだけで、リソース ファイルまたはデータベースから説明情報を読み取ることもできます。
コメント コードに気づいたはずです。列挙値のカスタム メソッドがカスタム説明情報を取得できない場合、この列挙値で注釈が付けられた MyEnumDescriptionAttribute が指定されているかどうかが最初にチェックされ、指定されている場合はこの内容が返されます。それ以外の場合は、列挙値の ToString() コンテンツを返します。
MyEnumDescriptionAttribute を使用して、次のように SimpleStatus を記述します。
1 public enum SimpleStatus
2 {
3 [MyEnumDescription(DefaultDescription="値 1 のデフォルトの説明")]
4 値 1 = 1、
5 [MyEnumDescription(DefaultDescription="値2のデフォルトの説明")]
6 値 2 = 2
7}
ページを再度実行すると、DropDownList の Value1 に対応して表示される情報が Value1 のカスタム記述であり、Value2 に対応して表示される情報が Value2 のデフォルト記述であることがわかります。なぜ? Value1 の場合は MyEnumDescriptionAttribute によって返されるカスタム情報を取得でき、Value2 の場合は MyEnumDescriptionAttribute が null を返すため、デフォルトの説明情報が適用されます。すごいと思いませんか?
さらに、異なる EnumDescriptionAttribute またはその継承クラスを混合して使用して、同じ Enum 型の異なるメンバー項目の説明情報を指定することもできます (そのような必要があるでしょうか ^-^)。ただし、最初の EnumDescriptionAttribute またはその継承クラス アノテーションのみが各列挙項目に対して有効になり、冗長なアノテーションは無視されます。
さて、基本的な紹介は終わりました。この計画は完璧な計画だと言えます。腐った卵は投げないでください。 :)
だけでなく
、EnumDescriptionAttribute を単独で使用して列挙値の説明情報を透過的に取得することもできます。静的メソッド EnumDescriptionAttribute.GetDescriptions(enumType) を呼び出すと、EnumDescriptionAttribute またはその継承クラスでマークされた指定された列挙型のすべての列挙値の説明情報を取得できます。
DropDownListField クラスは、ASP.NET の組み込み CheckBoxField クラスを参照して作成されます。
さ
れているコンポーネントのすべてのソース コードとサンプル コードは、nbear の最新バージョンに含まれています。EnumDescriptionAttribute は srcNBear.CommonEnumDescriptionAttribute.cs に定義されており、DropDownListField は srcNBear.Web.Data に定義されています。ドロップダウンリストフィールド。サンプル プログラムは、tutorialsNBearDataSourceSample にあります。
これは、NBear の公式 Web サイトからダウンロードできます: http://nbear.org
-
[05/26 改訂] - サードパーティの列挙記述のサポートと、バイナリおよび市販の列挙値のサポートを追加しました。 NBearV3.7.1 ビルド 7 以降に含まれています。
1. サードパーティのコンパイル済みアセンブリの列挙型の場合、つまり EnumDescriptionAttribute を列挙定義に直接追加する機会がないため、サポートされるようになりました。必要なのは、外部列挙型に対応する追加の列挙型を定義して、2 つの列挙型の列挙項目の int 値が等しいことを確認し、この新しい列挙型で EnumDescriptionAttribute をマークすることだけです。もちろん、この時点では、EnumType 属性に新しい列挙型名を入力する必要があります。
2. 追加設定なしで、バイナリ AND をサポートする列挙値もサポートされるようになりました。ただし、この列挙値の挿入と編集をマージされた値に更新する必要がある場合、ユーザーはそれを完了するためのコードを記述する必要があります。これは、そのような値の表示のみをサポートします。
//この記事の終わり