[C#][Windows Formsアプリ][MonthCalendar] AddBoldedDate / RemoveBoldedDate / RemoveAllBoldedDates の使い分け

スポンサーリンク

はじめに

本記事では、Windows Forms の MonthCalendar における AddBoldedDate / RemoveBoldedDate / RemoveAllBoldedDates の使い分けを、実務に直結する最短パターンで解説します。
「特定日を太字にする」「取り消す」「一括で初期化する」操作を安全に行い、UpdateBoldedDates() で確実に反映する流れを押さえます。

説明

基本APIの役割

AddBoldedDate(DateTime date):単発のその日だけを太字に追加。
RemoveBoldedDate(DateTime date):単発太字からその日を除去。
RemoveAllBoldedDates():単発太字(Annually/Monthly は対象外)を全部クリア

いずれの操作後も、UpdateBoldedDates() を呼ばないと画面に反映されません。複数日をまとめて更新する場合は、「全ての追加・削除 → 最後に1回だけ」呼ぶのが効率的です。

サンプルコード

最小UI:MonthCalendar と 3 つのボタン(追加/削除/全削除)。「今日」を対象に挙動を確認します。

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

class MainForm : Form
{
    private MonthCalendar cal = new MonthCalendar { Dock = DockStyle.Fill };
    private Button btnAdd    = new Button { Text = "今日を太字に追加", Dock = DockStyle.Top };
    private Button btnRemove = new Button { Text = "今日の太字を削除", Dock = DockStyle.Top };
    private Button btnClear  = new Button { Text = "単発太字を全クリア", Dock = DockStyle.Top };

    public MainForm()
    {
        Text = "MonthCalendar - Add/Remove/RemoveAll BoldedDates";
        Controls.Add(cal);
        Controls.Add(btnClear);
        Controls.Add(btnRemove);
        Controls.Add(btnAdd);

        btnAdd.Click += (s, e) =>
        {
            var d = DateTime.Today.Date;
            cal.AddBoldedDate(d);
            cal.UpdateBoldedDates(); // 反映
        };

        btnRemove.Click += (s, e) =>
        {
            var d = DateTime.Today.Date;
            cal.RemoveBoldedDate(d);
            cal.UpdateBoldedDates(); // 反映
        };

        btnClear.Click += (s, e) =>
        {
            cal.RemoveAllBoldedDates(); // 単発の太字のみ全削除(Annually/Monthly は残る)
            cal.UpdateBoldedDates();    // 反映
        };
    }

    // --- 補足:一括登録の最短パターン(必要に応じて呼び出し) ---
    private void BulkSetBoldedDates()
    {
        cal.RemoveAllBoldedDates();
        foreach (var d in new[]
        {
            new DateTime(2026, 1, 1),
            new DateTime(2026, 5, 3),
            new DateTime(2026, 12, 25)
        })
        {
            cal.AddBoldedDate(d);
        }
        cal.UpdateBoldedDates(); // 最後に1回だけ
    }

    // --- 補足:重複追加を避ける安全追加 ---
    private void AddBoldedDateIfNotExists(DateTime day)
    {
        bool already = Array.Exists(cal.BoldedDates, x => x.Date == day.Date);
        if (!already)
        {
            cal.AddBoldedDate(day.Date);
            cal.UpdateBoldedDates();
        }
    }

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

補足:一括登録の最短パターン

cal.RemoveAllBoldedDates();
foreach (var d in new[] { 
    new DateTime(2026, 1, 1), 
    new DateTime(2026, 5, 3), 
    new DateTime(2026, 12, 25) }
) 
cal.AddBoldedDate(d); 
cal.UpdateBoldedDates(); // 最後に1回回

つまづきポイント

1) 反映されない
UpdateBoldedDates() の呼び忘れが定番。まとめて更新するときも最後に必ず1回呼びましょう。

2) 全削除しても毎年/毎月の太字が残る
RemoveAllBoldedDates() は「単発」のみが対象。毎年は RemoveAllAnnuallyBoldedDates()、毎月は RemoveAllMonthlyBoldedDates() を使用します(または個別に Remove 系で除去)。

3) 同じ日を重複追加してしまう
重複しても例外にはなりませんが、前処理で BoldedDates に存在するかを確認すると安全です。

var d = DateTime.Today.Date;
bool already = Array.Exists(cal.BoldedDates, x => x.Date == d)
if (!already) cal.AddBoldedDate(d);

4) Annually/Monthly と混同する
単発日は AddBoldedDate、毎年は AddAnnuallyBoldedDate、毎月は AddMonthlyBoldedDate。用途で明確に使い分けましょう。

まとめ

単発太字は AddBoldedDateRemoveBoldedDate、全消去は RemoveAllBoldedDates。そして最後に UpdateBoldedDates()。この基本フローを徹底するだけで、太字ハイライトの管理はシンプルかつ堅牢になります。用途に応じて Annually/Monthly 系も組み合わせましょう。

Please follow and like us:

コメント

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