はじめに
本記事では、Windows Forms の MonthCalendar でMinDate / MaxDate により選べる日付範囲をしばる最短手順を解説します。会計年度・キャンペーン期間・予約可能期間など、許可したい範囲の外を最初から選べなくするのが狙いです。
説明
MinDate と MaxDate を設定すると、その範囲外は選択不可&無効表示になります。さらに、初期表示の選択が範囲外にならないよう、開始日(もしくは範囲内の任意の日)に寄せておくのが定石です。
サンプルコード
最小コードで「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 で選べる日付範囲をしばる

コメント