概要
C#の構造体の情報を使ってHTMLのセレクトボックス(ドロップダウンともいうselectタグとoptionタグのやつ)を作成する場合、値であるvalueは構造体から取得できますが、実際に画面に表示させる文字列はどうやっていますか?
今回はそれらの情報をカスタム属性を使用して構造体に記載し、構造体のデータだけでセレクトボックスを作成する方法を解説します。
前提環境
- Windows 10
- Visual Studio Professional 2019
- .NET Framework 4.2
- C#
コードのポイント
- カスタム属性「System.ComponentModel.DescriptionAttribute」を使うことで、構造体のメンバに対して説明の文字列を追加することができます。
- 構造体のメンバをforeachで取得するにはEnum.GetValuesを使用します。
- カスタム属性を取得するにはGetCustomAttributesを使用します。
サンプルコード
前提となる構造体
public enum FruitEnum
{
[System.ComponentModel.DescriptionAttribute("りんご")]
Apple = 1,
[System.ComponentModel.DescriptionAttribute("みかん")]
Orange = 2,
[System.ComponentModel.DescriptionAttribute("パイナップル")]
Pine = 3,
}
HTMLのセレクトボックス(ドロップダウン)の作成
Type type = typeof(FruitEnum);
string inputHtml = "<select name=\"fruitName\">";
// 構造体の各メンバの値をforeachで取得する。
foreach (Object enumVal in Enum.GetValues(type))
{
// 構造体の値からメンバを取得
FieldInfo enumField = type.GetField(enumVal.Tostring());
// 構造体のメンバに設定したカスタム属性を取得する。
// カスタム属性は同じものを複数設定できることがあるため、配列で取得することになる。
// そのためFirstOrDefaultで1つに絞り込む。
var attributes = (DescriptionAttribute[])enumField.GetCustomAttributes(typeof(DescriptionAttribute), false);
var desciptionstring = attributes.Select(n => n.Description).FirstOrDefault();
string enumName = desciptionstring.Tostring();
inputHtml += $"<option value=\"{enumVal.Tostring()}\">{enumName}</option>";
}
inputHtml += $"</select>";
Formから取得したデータ(文字列)を構造体に変換する場合
string value = Page.Request.Form["fruitName"];
FruitEnum fruit;
if (! Enum.TryParse<FruitEnum>(value, out fruit)) {
fruit = FruitEnum.Apple;
}