[C#][Windows Formsアプリ][MonthCalendar] MinDate / MaxDate で選べる日付範囲をしばる

スポンサーリンク

はじめに

本記事では、Windows Forms の MonthCalendarMinDate / MaxDate により選べる日付範囲をしばる最短手順を解説します。会計年度・キャンペーン期間・予約可能期間など、許可したい範囲の外を最初から選べなくするのが狙いです。

説明

MinDateMaxDate を設定すると、その範囲外は選択不可&無効表示になります。さらに、初期表示の選択が範囲外にならないよう、開始日(もしくは範囲内の任意の日)に寄せておくのが定石です。

サンプルコード

最小コードで「2026/01/01〜2026/12/31 のみ選択可能」にします。今日が範囲外なら自動的に期間の開始日に寄せます。

using System;
using System.Windows.Forms;

class MainForm : Form
{
    public MainForm()
    {
        Text = "MonthCalendar - MinDate/MaxDate";
        var cal = new MonthCalendar { Dock = DockStyle.Fill };
        Controls.Add(cal);

        var start = new DateTime(2026, 1, 1);
        var end   = new DateTime(2026, 12, 31);

        cal.MinDate = start;
        cal.MaxDate = end;

        var today = DateTime.Today;
        var init  = (today < start || today > end) ? start : today;
        cal.SetSelectionRange(init, init); // 初期選択を範囲内に
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new MainForm());
    }
}

ポイント(超要約)
・範囲の外は選べない&無効表示になるので、余計なバリデーションが減る。
・初期選択は MinDate 以上 MaxDate 以下に必ず寄せる。

つまづきポイント

1) 今日が範囲外で例外?
例外は出ませんが、想定外の初期選択になることがあります。サンプルのように「範囲外なら開始日に寄せる」処理を入れると安全です。

2) SelectionStart/End を直接セットしてもいい?
OK ですが、SetSelectionRange の方が「開始=終了」をまとめて指定でき、単一日選択が読みやすくなります。

3) 期間を UI から動的に変えたい
MinDate/MaxDate を変更後、現在の選択が範囲外になっていないかをチェックし、必要に応じて開始日に寄せ直しましょう。

まとめ

選択可能期間を固定したいなら、MinDate / MaxDate を設定し、初期選択を範囲内に寄せる——この2ステップが最短・確実です。これで不正な日付選択や後段のバリデーション負荷をグッと減らせます。

記事タイトル:
Windows Forms × MonthCalendar:MinDate / MaxDate で選べる日付範囲をしばる

 

Please follow and like us:

コメント

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