はじめに
Windows Forms の DateTimePicker コントロールで、
「今、ユーザーがどの日付・時刻を選んでいるか」 を扱う中心となるのが Value プロパティです。
DB に保存するときも、画面初期表示をセットするときも、まず触るのはこの Value と言っていいくらい大事なプロパティです。
Value は DateTimePicker の「現在値(DateTime 型)」を表すプロパティと覚えておくとOKです。
Value プロパティとは?
| プロパティ名 | 型 | 役割 |
|---|---|---|
Value |
DateTime |
DateTimePicker で現在選択されている日付・時刻 |
Value の型は System.DateTime です。
Text プロパティのような文字列ではなく、「日時」として扱えるので、
日付計算や比較にもそのまま利用できます。
現在選択されている日付・時刻を取得する
一番よく使うのは、ユーザーが選んだ日付を取得して、
ラベルに表示したり、データベースに保存したりするパターンです。
// 現在選択されている日付を取得
DateTime selectedDate = dateTimePicker1.Value;
// 文字列として表示
label1.Text = selectedDate.ToString("yyyy/MM/dd");
もちろん、時刻も含めて扱えます。
// 時刻まで含めた表示
label2.Text = selectedDate.ToString("yyyy/MM/dd HH:mm:ss");
Value ではなく ToString() のフォーマット文字列でコントロールします。
初期値(既定の日時)を設定する
フォーム表示時に、「今日の日付」「締切日」「契約開始日」など、
あらかじめ意味のある日付をセットしておくと、ユーザーが楽になります。
フォームのコンストラクタや Load イベントで設定する例
public Form1()
{
InitializeComponent();
// フォーム表示時の初期日付を「今日」に設定
dateTimePicker1.Value = DateTime.Today;
// あるいは任意の日付
dateTimePicker1.Value = new DateTime(2025, 12, 31);
}
DateTime.Today は「今日の日付(時刻は 0:00)」、
DateTime.Now は「現在の日時(時刻を含む)」を表します。
MinDate / MaxDate と Value の関係
DateTimePicker には、選択可能な日付の範囲を制限するための
MinDate / MaxDate プロパティがあります。
MinDate… 選択できる最小日付MaxDate… 選択できる最大日付
Value に設定する日時は、必ずこの範囲内である必要があります。
範囲を設定してから Value を設定する例
// 過去1年〜未来1年 の範囲に制限
dateTimePicker1.MinDate = DateTime.Today.AddYears(-1);
dateTimePicker1.MaxDate = DateTime.Today.AddYears( 1);
// 初期値を今日に
dateTimePicker1.Value = DateTime.Today;
「先に MinDate / MaxDate を設定」→「その範囲内の Value を設定」の順で書くのが安全です。
ShowCheckBox / Checked との組み合わせ(NULL 相当の扱い)
業務アプリでは「日付は任意(NULL でもよい)」というケースも多いです。
DateTimePicker の Value は DateTime 型なので、直接 NULL を入れることはできません。
その代わりに使うのが ShowCheckBox と Checked です。
ShowCheckBox = trueで、チェックボックス付き DateTimePicker にするCheckedがfalseのときは「未選択」とみなす、というルールを自分で決める
例:NULL 相当の扱いをする
// 初期表示:未選択状態に見せる
dateTimePicker1.ShowCheckBox = true;
dateTimePicker1.Checked = false;
dateTimePicker1.Value = DateTime.Today; // 内部的には何か入れておく
// 保存時の処理例
DateTime? deadline = null;
if (dateTimePicker1.Checked)
{
deadline = dateTimePicker1.Value; // チェックされているときだけ有効
}
このように、実データとしては DateTime?(Nullable<DateTime>)を使い、
画面側では Checked の ON/OFF で NULL 相当を表現するのがよくあるパターンです。
Value と Format / CustomFormat の関係
DateTimePicker は、表示形式を Format プロパティで切り替えられます。
Format = DateTimePickerFormat.Short… 「2025/11/24」などの日付だけFormat = DateTimePickerFormat.Long… 「2025年11月24日月曜日」などFormat = DateTimePickerFormat.Time… 「13:45」などの時刻Format = DateTimePickerFormat.Custom… 自分で書式を指定
**重要なのは**、表示形式が変わっても Value 自体は常に `DateTime` だということです。
CustomFormat 例
dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = "yyyy/MM/dd (ddd) HH:mm";
dateTimePicker1.Value = DateTime.Now;
画面上の見え方は変わりますが、Value からはいつでも DateTime として日時が取得できます。
よくあるパターンとサンプルコード
期間入力(開始日・終了日)のチェック
private void buttonSave_Click(object sender, EventArgs e)
{
DateTime start = dateTimePickerStart.Value;
DateTime end = dateTimePickerEnd.Value;
if (end < start)
{
MessageBox.Show("終了日は開始日以降を指定してください。");
return;
}
// 保存処理…
}
日付の前後関係は、Value 同士の大小比較で簡単に判定できます。
「今日ボタン」で現在日時に戻す
private void buttonToday_Click(object sender, EventArgs e)
{
dateTimePicker1.Value = DateTime.Today;
}
時刻だけを扱いたい場合
// 時刻入力用の設定
dateTimePicker1.Format = DateTimePickerFormat.Time;
dateTimePicker1.ShowUpDown = true; // スピンボックス風
dateTimePicker1.Value = DateTime.Now;
// 保存時は Value.TimeOfDay などで時刻成分だけ使うことも可能
TimeSpan selectedTime = dateTimePicker1.Value.TimeOfDay;
ありがちなハマりポイント
- MinDate / MaxDate の範囲外をセットして例外
→ 必ず範囲を先に設定し、その範囲内の Value を指定しましょう。 - NULL を直接入れられない
→ Nullable<DateTime> と Checked / ShowCheckBox を組み合わせて設計します。 - ユーザーが日付を変えたタイミングを知りたい
→ValueChangedイベントを使います。Value の記事とセットで覚えておくと便利です。 - 表示形式を変えても、Value そのものは変わらない
→ 見た目は Format / CustomFormat、実データは Value で分離して考えましょう。
まとめ
Valueは DateTimePicker の「現在選択されている日付・時刻」を表す、最重要プロパティ。- 型は
DateTimeで、日付計算・比較にそのまま使える。 MinDate/MaxDateの範囲外は指定不可。- NULL 相当の扱いは
ShowCheckBox/Checkedと Nullable<DateTime> で工夫する。 - 表示形式は
Format/CustomFormat、値そのものはValueと役割分担して考える。
まずは「ユーザーが選んだ日付をどう受け取るか」「どう初期値をセットするか」から、
たくさん Value を触って慣れていきましょう。
次のステップとしては、ValueChanged イベント と組み合わせた「選択変更時の処理」もぜひ押さえておくと、実用的な画面が一気に作りやすくなります。
コメント