[C#][Windows Formsアプリ][DateTimePicker] Checkedプロパティで日付を「入力済み」か「未入力」か切り替える

スポンサーリンク

はじめに

Windows Forms の DateTimePicker で、日付を「入力済み」か「未入力」か切り替えたいときに
重要な役割を果たすのが Checked プロパティ です。
特に ShowCheckBox = true のとき、チェックボックス付き DateTimePicker として
「この日付を有効にする/しない」をユーザーに選ばせることができます。

💡 一言でいうと:
Checked は「この DateTimePicker の値を有効として扱うかどうか」を示すフラグです。
内部の Value は常に存在しますが、Checked が false のときは「未選択扱い」にできます。

 

Checked プロパティとは?

プロパティ名 役割
Checked bool DateTimePicker のチェックボックスがチェックされているかどうか

特に ShowCheckBox = true の場合、
コントロールの左側にチェックボックスが表示され、その ON / OFF が Checked プロパティに反映されます。

  • Checked = true … 日付が「有効」として扱われる状態
  • Checked = false … 日付が「未選択(無効)」と見なされる状態

 

ShowCheckBox との関係

Checked を実務で使うときは、ほぼ必ず ShowCheckBox とセットです。

// チェックボックス付き DateTimePicker にする
dateTimePicker1.ShowCheckBox = true;

// 初期状態は「未選択」に見せたい場合
dateTimePicker1.Checked = false;

// 逆に「最初から有効」にしたい場合
// dateTimePicker1.Checked = true;

チェックが外れているときは、日付表示がうっすらグレーになり、
ユーザーに「この日付は今は使われていない」ことが視覚的に伝わります。

ShowCheckBox = false の場合は、チェックボックス自体が表示されないため、
Checked を切り替えてもユーザーには分かりません。
通常は ShowCheckBox = true と一緒に使うものと考えておきましょう。

 

Value と Checked の関係(NULL 相当の扱い)

DateTimePicker の ValueDateTime 型であり、NULL にはなりません
そのため、「日付が未入力」という状態を表現したいとき、Value だけでは不十分です。

そこでよく使われるのが、「Checked = false を NULL 相当として扱う」という設計です。

例:DB に Nullable<DateTime> で保存する場合

// 画面側(フォームロードなど)
dateTimePicker1.ShowCheckBox = true;

// DBから読み込んだ期限日(NULL許容)
DateTime? deadline = GetDeadlineFromDb();

if (deadline.HasValue)
{
    dateTimePicker1.Value   = deadline.Value;
    dateTimePicker1.Checked = true;   // 有効な日付として表示
}
else
{
    dateTimePicker1.Value   = DateTime.Today; // 仮の値
    dateTimePicker1.Checked = false;          // 未選択扱い
}

// 保存時の処理
DateTime? newDeadline = null;
if (dateTimePicker1.Checked)
{
    newDeadline = dateTimePicker1.Value;  // チェックON時だけ有効
}
SaveDeadlineToDb(newDeadline);

このように、内部では Nullable<DateTime> を使いながら、
画面上では Checked の ON/OFF で「日付あり/なし」を表現できます。

 

Checked の読み書きの基本

現在の状態を取得する

bool isEnabled = dateTimePicker1.Checked;

if (isEnabled)
{
    Console.WriteLine("日付は有効です。値: " + dateTimePicker1.Value.ToShortDateString());
}
else
{
    Console.WriteLine("日付は未選択です。");
}

コードからチェック状態を変更する

// 日付を有効にする
dateTimePicker1.Checked = true;

// 日付を未選択扱いにする
dateTimePicker1.Checked = false;

ユーザーの操作だけでなく、ビジネスロジックに応じてコード側から ON/OFF することもできます。

 

Checked と ValueChanged / イベントの関係

ユーザーがチェックボックスを操作するとき、実際には次のようなイベントが絡んできます:

  • ValueChanged … 値(Value)が変わったとき
  • CheckedChanged(存在しない) … DateTimePicker には専用イベントはない

DateTimePicker には CheckedChanged イベントは無いため、
「チェックボックスの ON/OFF をトリガーにしたい」場合は ValueChanged
CloseUp などと組み合わせるか、自前で前回値との比較を行う必要があります。

📝 シンプルな設計なら、保存時に「今の Checked と Value を読む」だけでも十分なことが多いです。
リアルタイムに UI を変えたい場合のみ、イベントを工夫して使いましょう。

 

実用パターン:開始日・終了日の「有効/無効」

よくあるのが、「終了日は任意」「終了日は指定しない場合もある」といった条件付き日付です。

// 開始日は必須
dateTimePickerStart.ShowCheckBox = false;

// 終了日は任意
dateTimePickerEnd.ShowCheckBox = true;
dateTimePickerEnd.Checked      = false; // デフォルトは「終了日なし」

// 保存時
DateTime startDate = dateTimePickerStart.Value;
DateTime? endDate  = null;

if (dateTimePickerEnd.Checked)
{
    endDate = dateTimePickerEnd.Value;
}

// startDate, endDate を DB に保存…

このように、Checked を使うことで「日付の有効/無効」を自然に表現できます。

 

よくある注意点・ハマりポイント

  • Checked = false でも Value は存在する
    → 「未選択だから Value は無視して良い」というルールを自分で決めておくことが重要です。
  • ShowCheckBox = false のまま Checked を使おうとする
    → ユーザーからは見えないので、基本的には意味がありません。UI と一体で考えましょう。
  • 必須入力なのに ShowCheckBox = true にしてしまう
    → ユーザーがチェックを外せてしまうため、「必須ならチェックボックス自体を出さない」方が安全です。
  • デフォルト値の扱いがあいまい
    → 「値が無いときは Today を入れて Checked=false」といった
    “画面内ルール” をきちんと決めておくと、後から迷わなくなります。

 

まとめ

  • Checked は DateTimePicker の「日付が有効かどうか」を表すフラグ。
  • ShowCheckBox = true のとき、ユーザーがチェックボックスで ON/OFF を操作できる。
  • Value は常に DateTime を持ち、NULL にはならない。
    → NULL 相当は「Checked = false として扱う」のが定番。
  • Nullable<DateTime> と組み合わせることで、DB や業務ロジックと自然に連携できる。
  • 日付必須項目では ShowCheckBox を使わず、Checked も意識しない設計でシンプルに。

「日付があるか・ないか」「この日付は効いているのか」を表現するには、
Value だけでは足りず、Checked の出番になります。
特に業務アプリではよく使うパターンなので、ShowCheckBox + Checked + Nullable<DateTime> のセットで
一度実装してみると、イメージがつかみやすくなりますよ。

Please follow and like us:

コメント

タイトルとURLをコピーしました