So-net無料ブログ作成

.NET framework の DateTimePicker にバグを見つけました [戯言]

.NET framework の DateTimePicker(日時を入力するコントロール)にバグを見つけました。

.NET framework 1.1 (Visual Studio .NET 2003)、.NET framework 3.5 (Visual Studio 2008) で確認しました。

確認のために、こんなプログラムを作ります。
サンプルプログラム(17kb)

  1. フォームに DateTimePicker と Button を配置する。
  2. フォームの AcceptButton プロパティに、配置した Button を設定する。
  3. Buttonのクリックイベントで、DateTimePicker の設定値を参照する。

そして、次の様に操作します。

  1. DateTimePicker の「日」のところを選択し、キーボードから日付を入力する。
    入力する日付は1桁限定(1~9のどれか。ただし 01 とか 09 の様には入力しない)
  2. 日付の入力が終わったら、すかさず Enter キーを押す。

すると、フォームの AcceptButton が設定されているので Button のクリックイベントが発生するのですが、ここで参照した DateTimePicker の設定値が変更前の値で取得されてしまいます。

色々と試したところ、次のことが分かりました。

  • 「日」じゃなくて「月」でも同じことが起こる。
  • 2桁を入力すると発生しない。
  • (表示上は1桁にしか見えなくても)01 の様に入力すると発生しない。
  • 「年」も 1 ~ 3 桁なら発生する。
  • 「日」「月」の両方とも1桁で入力しても、最後に入力したところ意外は正しい値になっている。
  • 「時」「分」「秒」のところは試してないけど、多分同じじゃなかろうか
  • マウス操作でボタンをクリックすると発生しない。
  • 一旦、他のコントロールにフォーカス移すと発生しない。

ここから予測されるのは、DateTimePicker では、入力した内容が確定するのはフォーカスが移動するか最大桁数を入力した時で、Enter キーの入力ではフォーカスが移動しないために変更前の値が取れてしまうと言うことなのでしょうね。


で、これを回避する方法ですが、そもそもが Enter キーでAcceptButtonのクリックイベントが呼ばれる時にフォーカスが移動しないことな訳なので、

  • AcceptButtonへの設定をあきらめる。
  • AcceptButtonのクリックイベントのところで、強制的にフォーカスを移動してしまう。

のどちらかでしょう。
個人的には2つ目がお勧めです。


タグ:.net
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0