日付関連で、取得した値がどうか?ってのを検出して判定する必要が出たのでメモ。
CloseUpイベントで何が判定されるのか?
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datetimepicker.closeup(v=vs.110).aspx
ドロップダウン形式の予定表が閉じられた場合や、非表示になった場合に発生します。
ということで、手動で変更した時ではなく、カレンダーのリストから日付を選択したりした場合にイベントが発生してくれる。
ValueChangeイベントじゃ駄目なのか?
ValueChangeイベントでも値の変更自体は取得可能。
なので、これで問題なさそうなんだけど、日付の判定を行う場合、少し厄介になってくる。
一応、こんな感じで書けるんだけど
private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { DateTime getDate; if(DateTime.TryParse(dateTimePicker1.Value.toString(), getDate)) { getDate.Value = DateTime.Now; } }
エラー処理はさておき、TryParseで日付型として取得不可能な値が設定されていた場合に、別の日付を設定する。
と、再度ValueChangeイベントが発生してしまう。
これは、try-catch でエラー処理をかまして対応しても同じ。
まぁ、ValueChangeイベントで正しく扱える値をセットしたりするので、2回目のValueChangeイベントで問題は発生しないんだけど、一々やりづらい。
CloseUpイベントで日付の変更を取得する
private void dateTimePicker1_CloseUp(object sender, EventArgs e) { DateTime getDate; if(DateTime.TryParse(dateTimePicker1.Value.toString(), getDate)) { getDate.Value = DateTime.Now; } }
こんな感じで書く。
といっても、イベント名をValueChangeからCloseUpへ変更したぐらい。
手で書きたくない場合は、プロパティのダブルクリックで
フォームにDateTimePickerコントロールを貼り付ける
プロパティウィンドウのタブをプロパティから、イベントに変更
CloseUpをダブルクリック
private void dateTimePicker1_CloseUp(object sender, EventArgs e) { //ここに処理 }
こんな感じで勝手に挿入してくれるので、必要な処理を書き込む。