はじめに
本記事では、Windows Forms の MonthCalendar で特定日を太字で強調するための仕組み BoldedDates を最短理解します。
一度限りの記念日・毎年同じ月日の祝日・毎月の締め日などをひと目で分かるようにする使い分けと、実装でハマりやすいポイントを解説します。
説明
MonthCalendar には太字管理用の 3 系列 API があります。
・AddBoldedDate(DateTime) … 単発の特定日を太字(例:2026/01/01 のみ)
・AddAnnuallyBoldedDate(DateTime) … 毎年同じ月日を太字(年は無視、例:2/11)
・AddMonthlyBoldedDate(DateTime) … 毎月同じ日を太字(例:毎月15日)
追加・削除の後は UpdateBoldedDates() を呼ぶと表示に反映されます(忘れると見た目が更新されません)。また、RemoveBoldedDate / RemoveAnnuallyBoldedDate / RemoveMonthlyBoldedDate で解除できます。
サンプルコード
最小構成で「単発・毎年・毎月」の太字設定と、ボタンで「今日を太字トグル」を実装します。
using System;
using System.Linq;
using System.Windows.Forms;
class MainForm : Form
{
MonthCalendar cal = new MonthCalendar { Dock = DockStyle.Fill };
Button btnToggleToday = new Button { Text = "今日を太字トグル", Dock = DockStyle.Top };
public MainForm()
{
Text = "MonthCalendar - BoldedDates 基本";
Controls.Add(cal);
Controls.Add(btnToggleToday);
// --- 基本:特定日を太字にする ---
cal.AddBoldedDate(new DateTime(2026, 1, 1)); // 特定の1日
cal.AddAnnuallyBoldedDate(new DateTime(2000, 2, 11)); // 毎年2/11(年は無視)
cal.AddMonthlyBoldedDate(new DateTime(2000, 1, 15)); // 毎月15日
cal.UpdateBoldedDates(); // 反映
// 今日を太字に出したり消したり
btnToggleToday.Click += (s, e) =>
{
DateTime d = DateTime.Today.Date;
bool isBold = cal.BoldedDates.Any(x => x.Date == d);
if (isBold) cal.RemoveBoldedDate(d);
else cal.AddBoldedDate(d);
cal.UpdateBoldedDates();
};
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MainForm());
}
}
サンプル解説:
・AddBoldedDate は「年・月・日」まで使うため、その日だけ太字。
・AddAnnuallyBoldedDate は月日のみ採用(年は無視)。年を 2000 にしているのは便宜的で、任意で構いません。
・AddMonthlyBoldedDate は日だけを見るので毎月同じ日に太字。
・UpdateBoldedDates() を呼ぶまで画面には反映されません。
・「今日を太字トグル」は BoldedDates(単発太字の配列)を覗いて存在チェック→追加/削除→更新、の流れです。
つまづきポイント
1) 追加したのに太字にならない
UpdateBoldedDates() の呼び忘れが定番です。追加/削除のバッチ後に必ず呼びましょう。
2) うるう年や月末の扱い
AddMonthlyBoldedDate(new DateTime(2000, 1, 31)) のように 31 日指定は、31 日が存在しない月では表示されません(その月に 31 日が無いから)。要件に応じて 30/31 調整や最終営業日計算を別途行ってください。
3) 休日テーブルを一括で反映したい
ループで AddBoldedDate などを複数回呼び、最後に 1 回だけ UpdateBoldedDates() を呼べば OK。高速です。
4) BoldedDates と選択範囲は別物
太字は「見た目の強調」で選択状態とは無関係です。選択は SelectionStart/End や SetSelectionRange で制御します。
まとめ
特定日の強調は AddBoldedDate(単発)・AddAnnuallyBoldedDate(毎年)・AddMonthlyBoldedDate(毎月)を使い分け、UpdateBoldedDates() で反映するだけ。
締め日・記念日・祝日のハイライトを手早く導入して、ユーザーの視線誘導と可読性を高めましょう。

コメント