ゴミ箱.net

汚物は消毒

列挙型をコンボボックスで選択できるようにするウルテク

.NET FrameWorkにおいて、コンボボックスを使って列挙型を選択できるようにする方法。

コンボボックスの名前はcomboBox1とする。
また、以下の列挙型が定義されているものとする。
public enum EHoge {
Hoge,
Piyo,
Fuga
}


なんとこれだけでいける。
comboBox1.DataSource = Enum.GetValues(typeof(EHoge));

この処理をフォームのコンストラクタのInitializeComponent()の後あたりに書いておけばおk。
注意点として、comboBox1のプロパティDropDownStyleはDropDownListにしておくこと。

これで、コンボボックスのプロパティSelectedItemを列挙型にキャストすれば、選択した列挙型の値を得ることができる。
上の例だと(EHoge)comboBox1.SelectedItemのようにする。

ただ、これだとちょっと困ったことがある。


まず、表示される文字列の設定ができない。
列挙型の定義で書いた名前がそのまま表示されてしまうのだ。
上の例だとHogeとかPiyoとかFugaがそのまま出てしまって不細工だ。

これをなんとかするには、コンボボックスのイベントFormatのイベントハンドラを設定すればよい。
このイベントハンドラ内で、コンボボックスに設定された値から表示される文字列を求める処理を行う。

イベントハンドラのListControlConvertEventArgs型の引数のプロパティListItemに、選択された列挙型の値が入る。
これに対応した文字列を引数のプロパティValueにつっこめばよい。

private void comboBox1_Format(object sender, ListControlConvertEventArgs e)
{
switch ((EHoge)e.ListItem)
{
case EHoge.Hoge:
e.Value = "ほげ";
break;

case EHoge.Piyo:
e.Value = "ぴよ";
break;

case EHoge.Fuga:
e.Value = "ふが";
break;

default:
break;
}
}


もうひとつ困ったことに、コンボボックスで選択された値をアプリケーション設定にバインドすることができない。
これに対応するには、2つのことを行う必要がある。

まず、コンボボックスのイベントSelectedValueChangedのイベントハンドラを処理し、値が変更されたら即アプリケーション設定を上書きするようにする。
以下の例ではアプリケーション設定にEHoge型の設定値Hogeがあるものとする。
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
Properties.Settings.Default.Hoge = (EHoge)comboBoxIndentType.SelectedItem;
}


次に、初期化のときにアプリケーション設定を取得するようにする。
コンボボックスのDataSourceを設定する前に設定値を変数にコピーし、DataSourceを設定した後にコンボボックスのプロパティSelectedItemにその値を設定する。
上記の
comboBox1.DataSource = Enum.GetValues(typeof(EHoge));

の処理を修正し、
EHoge tmpItem = Properties.Settings.Default.Hoge
comboBox1.DataSource = Enum.GetValues(typeof(EHoge));
comboBox1.SelectedItem = tmpItem;

のようにする。
なぜDataSouceを設定する直前にアプリケーション設定を退避して、直後に戻すというまどろっこしい処理をしているかというと、DataSourceを設定したときにSelectedValueChangedのイベントハンドラが実行され、アプリケーション設定が上書きされてしまうからだ。


今回の記事を書くに当たって以下のページを参考にした。
.NET Tip: Bind a Combo Box to an Enumeration
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する