[C#][Windows Formsアプリ][MonthCalendar] UpdateBoldedDates()の呼びどころ

スポンサーリンク

はじめに

本記事では、Windows Forms の MonthCalendar におけるUpdateBoldedDates() の呼びどころを最短で整理します。
「太字(Bolded)を追加・削除したのに画面に出ない」原因の9割は反映タイミングのミスです。単発・毎年・毎月の各 API と組み合わせた正しい呼び順を、極小コードで押さえましょう。

説明

MonthCalendar の太字系 API は次の3系列です。

・単発:AddBoldedDate / RemoveBoldedDate / RemoveAllBoldedDates
・毎年:AddAnnuallyBoldedDate / RemoveAnnuallyBoldedDate / RemoveAllAnnuallyBoldedDates
・毎月:AddMonthlyBoldedDate / RemoveMonthlyBoldedDate / RemoveAllMonthlyBoldedDates

重要:上記 いずれの追加・削除を行っても、UpdateBoldedDates() を呼ぶまで画面は更新されません。
ベストプラクティス:複数の追加/削除をまとめて実行 → 最後に 1 回だけ UpdateBoldedDates() を呼ぶ(=効率 & 確実)。

サンプルコード(極力短く)

「一括登録 → 最後に1回更新」「トグル → 直後に更新」の2パターンを最短構成で示します。

 using System;
using System.Linq;
using System.Windows.Forms;

class MainForm : Form
{
    MonthCalendar cal = new MonthCalendar { Dock = DockStyle.Fill };
    Button btnBatch = new Button { Text = "一括登録(最後に1回更新)", Dock = DockStyle.Top };
    Button btnToggleToday = new Button { Text = "今日の単発太字をトグル", Dock = DockStyle.Top };

    public MainForm()
    {
        Text = "MonthCalendar - UpdateBoldedDates の要点";
        Controls.Add(cal);
        Controls.Add(btnToggleToday);
        Controls.Add(btnBatch);

        // 1) 一括登録:単発 / 毎年 / 毎月 をまとめて設定 → 最後に 1 回だけ Update
        btnBatch.Click += (s, e) =>
        {
            cal.RemoveAllBoldedDates();
            cal.RemoveAllAnnuallyBoldedDates();
            cal.RemoveAllMonthlyBoldedDates();

            // 単発(その年だけ強調)
            cal.AddBoldedDate(new DateTime(2026, 1, 1));
            cal.AddBoldedDate(new DateTime(2026, 12, 25));

            // 毎年(年はダミーで OK)
            cal.AddAnnuallyBoldedDate(new DateTime(2000, 2, 11));
            cal.AddAnnuallyBoldedDate(new DateTime(2000, 12, 24));

            // 毎月(年月はダミーで OK、日だけ有効)
            cal.AddMonthlyBoldedDate(new DateTime(2000, 1, 15));
            cal.AddMonthlyBoldedDate(new DateTime(2000, 1, 25));

            // ★最後に 1 回だけ反映★
            cal.UpdateBoldedDates();
        };

        // 2) 単発操作:トグル直後に更新(小刻み操作はその都度 Update で OK)
        btnToggleToday.Click += (s, e) =>
        {
            var today = DateTime.Today.Date;
            bool exists = Array.Exists(cal.BoldedDates, d => d.Date == today);
            if (exists) cal.RemoveBoldedDate(today);
            else cal.AddBoldedDate(today);

            // ★この操作単体の反映★
            cal.UpdateBoldedDates();
        };
    }

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

つまづきポイント

1) 増やしたのに太字にならない
UpdateBoldedDates() の呼び忘れが定番。追加/削除の後に必ず呼びましょう。

2) 全削除したのに「毎年/毎月」が残る
RemoveAllBoldedDates() は単発のみ。毎年は RemoveAllAnnuallyBoldedDates()、毎月は RemoveAllMonthlyBoldedDates() を使います。最後に UpdateBoldedDates()

3) 年や月の値は何でもいい?
毎年は「月日」、毎月は「日」だけが使われるため年はダミーで OK。ただし実在する日付にすること(例:2/30 は不可)。

4) パフォーマンスが気になる
多数の登録は「まとめて追加/削除 → 最後に 1 回 Update」。頻繁な Update 呼び出しは避けましょう。

まとめ

太字の見た目が変わらない時は、まず UpdateBoldedDates() の呼び忘れを疑いましょう。
実務ではバッチ更新は最後に 1 回単発操作はその都度という指針で運用すると、見た目と処理効率を両立できます。

Please follow and like us:

コメント

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