Home 開発室 開発メモ(DevExpress) DateEditの和暦対応
DateEditの和暦対応 印刷 Eメール

DateEditはDevExpress社の.Net Framework向けコンポーネントスイート"DXperience"のエディタライブラリ"XtraEditors"に含まれる日付エディタです。いわゆるドロップダウンカレンダーコントロールみたいなものです。

これをつかうと、キーボードから直接、またはドロップダウンカレンダーからのマウスクリックで、エンドユーザーに日付を入力してもらうことができます。

ところが(というか、当然なのですが)このコントロールは日本製ではないので、デフォルトの状態では和暦の日付("平成22年7月22日"とか、"h22/7/22"とか)をキーボードで入力することができません。これをなんとか和暦で入力できるようにしたので、早速メモ。

まずは普通にDateEditをコントロールに配置します。そのままVisualStudioでデバッグモードで実行してキーボードから"h22/7/22"と入力しようとすると、いきなり受け付けてくれません。これは入力マスク(DateEdit.Properties.Mask)が西暦のフォーマットとしてセットされているからです。

とりあえず、入力マスクを無効に(VisualStudioのプロパティグリッド上でDateEdit1.Properties.Mask.MaskTypeをNoneにセット)します。

これでDateEditのテキスト部分に「どんな」文字でも入力できるようになります。

和暦を入力すると、きちんと解釈してくれる

そして次に「入力された和暦での日付を西暦で理解してくれるようにする」方法を考えます。おそらくParseEditValueイベントを使って和暦を西暦に変換するコードを書けばいいんだろうなぁ...と思いながらおもむろに「h22/7/22」と入力すると、なんと、うまく認識してくれました。(ドロップダウンボタンをクリックすると、2010年7月22日が選択されていることを確認することができます。「平成22年7月22日」と入力した場合も同様にうまくいくようです。)

あとはここに正しく「日付」のみが入力されるように仕立てていくだけです。

まず入力マスクを編集して、西暦または和暦(h22/7/22のような)での日付入力形式での入力を受け付けるようにします。具体的には

  1. MaskTypeを"RegEx"(正規表現)にセット
  2. EditMaskに"([mtsh][0-9]?[0-9]|([123][0-9])?[0-9][0-9])/(0?[1-9]|1[012])/([012]?[1-9]|[123]0|31)"をセット

EditMaskが一見すごいことになっていますが、西暦に加えて和暦を示すm,t,s,hを入力できるように(MaskEditorのPredefined masksを参考にして)記述しています。

ここまでで西暦または和暦(h22/7/22のような)での日付入力ができるようになります。

ついでに入力された日付が(西暦ではなく)和暦で表示されるようにします。FormatEditValueイベントハンドラにコードを記述して、和暦で表示するようにします。(一部抜粋)

CultureInfo culture = new CultureInfo("ja-JP", true);
JapaneseCalendar jcalendar = new JapaneseCalendar();
DateTime input_date;
if (DateTime.TryParse(e.Value.ToString(), out input_date)) {
	char[] era_char = { 'm', 't', 's', 'h' };
	e.Value = era_char[jcalendar.GetEra(input_date) - 1].ToString() + jcalendar.GetYear(input_date) + "/" + jcalendar.GetMonth(input_date) + "/" + jcalendar.GetDayOfMonth(input_date);
	e.Handled = true;
}

以上でほぼ和暦対応ができました。(実際には上記のコードにくわえて、「日付がnullの場合」と、「和暦に変換できない西暦が入力された場合」の処理を追加する必要があります。)

あとはDateEditのvalidatingイベントハンドラで不正な日付(たとえば、h22/2/30のような)が入力された場合に対応するコードを書いて(説明は省略)、完成です。

欲を言うと、マウスホイールの回転や矢印キーで年・月・日を増減できるようにしたかったのですが、とりあえずここまでで良しとしました。

 

コメントを追加


セキュリティコード
再読込み