[C#][Windows Formsアプリ][MonthCalendar] 特定日を太字で強調する

スポンサーリンク

はじめに

本記事では、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/EndSetSelectionRange で制御します。

まとめ

特定日の強調は AddBoldedDate(単発)・AddAnnuallyBoldedDate(毎年)・AddMonthlyBoldedDate(毎月)を使い分け、UpdateBoldedDates() で反映するだけ。
締め日・記念日・祝日のハイライトを手早く導入して、ユーザーの視線誘導と可読性を高めましょう。

Please follow and like us:

コメント

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