[C#][Windows Formsアプリ][DateTimePicker] ValueChangedイベントで日付を変更したタイミングをキャッチする

スポンサーリンク

はじめに

DateTimePicker を扱ううえで最も重要なイベントが
ValueChanged イベント です。
ユーザーが日付を変更したタイミングを正確にキャッチし、
それに応じた処理を行いたい場合に必ず使用します。

💡 一言まとめ:
ValueChanged = 日付・時刻が変更された瞬間に発火するイベント

 

ValueChanged の基本情報

イベント名 ValueChanged
発生タイミング DateTimePicker の Value が変更された瞬間
典型的な用途 日付のバリデーション・他コントロールとの連動・表示内容の更新など

ユーザーが手入力で変更しても、カレンダー操作で変更しても発生するため、
最も信頼性の高い日付変更イベントです。

 

基本的な使い方

フォームデザイナで DateTimePicker を選び、
プロパティウィンドウ → イベント → ValueChanged をダブルクリックすると
イベントハンドラが自動生成されます。

最小限の使用例

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    DateTime selected = dateTimePicker1.Value;
    label1.Text = $"選択した日付: {selected:yyyy/MM/dd}";
}

これだけで、ユーザーが日付を変えるたびにラベルへ反映されます。

 

よくある実務的な利用例

① 期間選択(開始日 → 終了日)に利用

開始日を変更したら、終了日の最小値を動的に変更するパターンです。

private void startDatePicker_ValueChanged(object sender, EventArgs e)
{
    endDatePicker.MinDate = startDatePicker.Value;
}

② 日付に応じたデータ検索

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    LoadData(dateTimePicker1.Value);  // 選択日付のデータを取得
}

③ 日付によって UI の状態を変える

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    var d = dateTimePicker1.Value;

    if (d.DayOfWeek == DayOfWeek.Sunday)
    {
        labelStatus.Text = "休日です";
        labelStatus.ForeColor = Color.Red;
    }
    else
    {
        labelStatus.Text = "平日です";
        labelStatus.ForeColor = Color.Black;
    }
}

こうした小さな UI の変化が、ユーザーの利便性を大きく向上させます。

 

TextChanged ではなく ValueChanged を使うべき理由

DateTimePicker には Text プロパティも存在し、TextChanged イベントも利用できますが、
信頼性は ValueChanged のほうが圧倒的に高い です。

ValueChanged が推奨される理由

  • 内部的に DateTime 型で管理されるため入力のゆらぎが少ない
  • カレンダー操作でも手入力でも必ず発生する
  • 無効な日付が入力されない(自動補正される)
  • バリデーションがしやすい
✔ 「日付の変更を観測したい」
→ いつでも ValueChanged を使う のがベスト!

 

注意点

  • Value をコードから変更してもイベントが発生する
    → 自動処理のループに注意(フラグで制御するなど)
  • ShowUpDown = true の場合も発生する
    → カレンダーが表示されなくてもイベントは有効
  • Value が MinDate/MaxDate の範囲外になると例外
    → 事前に範囲を調整すること

 

イベントの正しいパターン:連続変更の抑制例

自動処理により ValueChanged が無限ループするのを避けるパターンです。

private bool _updating = false;

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    if (_updating) return;

    _updating = true;

    // ここに処理を書く
    DoSomething(dateTimePicker1.Value);

    _updating = false;
}

業務アプリではほぼ必須になる設計パターンです。

 

まとめ

  • ValueChanged は「日付が変わった瞬間」に発生する最重要イベント
  • UI 変更、バリデーション、期間チェックなど実務で必須
  • TextChanged ではなく ValueChanged を使うのが鉄則
  • コードによる変更でも発火する点に注意

DateTimePicker を使ったフォームでは、
ほぼ必ず登場するのがこの ValueChanged イベントです。
正しく扱うことで、ユーザーにとって快適でミスのない UI を作成できます。
ぜひ実務でも積極的に活用してみてくださいね。

Please follow and like us:

コメント

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