[C#][Windows Formsアプリ][MonthCalendar] AddAnnuallyBoldedDate / AddMonthlyBoldedDate / 各種Remove を体系的に学ぶ

スポンサーリンク

はじめに

本記事では、Windows Forms の MonthCalendar における AddAnnuallyBoldedDate / AddMonthlyBoldedDate と、その削除系 API(RemoveAnnuallyBoldedDate / RemoveAllAnnuallyBoldedDates / RemoveMonthlyBoldedDate / RemoveAllMonthlyBoldedDates)を体系的に整理します。祝日(毎年同じ月日)や締め日(毎月同じ日)など、繰り返し発生する目印を最短コードでハイライトするための実用パターンをまとめました。

説明

概念の切り分け

AddAnnuallyBoldedDate(DateTime)毎年の「月日」を太字化(年は無視)
AddMonthlyBoldedDate(DateTime)毎月の「日」を太字化(年・月は無視)

削除系(体系)

RemoveAnnuallyBoldedDate(DateTime):毎年太字から該当の月日を1件除去
RemoveAllAnnuallyBoldedDates():毎年太字を全クリア
RemoveMonthlyBoldedDate(DateTime):毎月太字から該当の日を1件除去
RemoveAllMonthlyBoldedDates():毎月太字を全クリア

重要: これらの追加・削除の最後に UpdateBoldedDates() を呼んで画面に反映します。
引数の DateTime は「Annually: 月日」「Monthly: 日」だけが意味を持つため、new DateTime(2000, m, d) のように年はダミーで構いません(ただし実在日付を指定)。

サンプルコード(極力短く:毎年/毎月の追加・削除・全消去)

起動時に「毎年 1/1」「毎月 15 日」を太字。ボタンで 2/11(毎年)の追加/解除、毎月「今日と同じ日」のトグル、各系列の全消去を行います。

using System;
using System.Windows.Forms;

class MainForm : Form
{
    MonthCalendar cal = new MonthCalendar { Dock = DockStyle.Fill };
    Button btnAddAnn   = new Button { Text = "毎年 2/11 を追加", Dock = DockStyle.Top };
    Button btnRemAnn   = new Button { Text = "毎年 2/11 を解除", Dock = DockStyle.Top };
    Button btnClrAnn   = new Button { Text = "毎年太字を全消去",  Dock = DockStyle.Top };
    Button btnTglMon   = new Button { Text = "毎月「今日と同じ日」をトグル", Dock = DockStyle.Top };
    Button btnClrMon   = new Button { Text = "毎月太字を全消去",  Dock = DockStyle.Top };

    public MainForm()
    {
        Text = "MonthCalendar - Annually/Monthly BoldedDates 体系";
        Controls.Add(cal);
        Controls.Add(btnClrMon);
        Controls.Add(btnTglMon);
        Controls.Add(btnClrAnn);
        Controls.Add(btnRemAnn);
        Controls.Add(btnAddAnn);

        // 初期ハイライト
        cal.AddAnnuallyBoldedDate(new DateTime(2000, 1, 1)); // 毎年 1/1
        cal.AddMonthlyBoldedDate(new DateTime(2000, 1, 15)); // 毎月 15日
        cal.UpdateBoldedDates();

        // --- 毎年:2/11 を追加/解除/全消去 ---
        btnAddAnn.Click += (s, e) =>
        {
            cal.AddAnnuallyBoldedDate(new DateTime(2000, 2, 11));
            cal.UpdateBoldedDates();
        };
        btnRemAnn.Click += (s, e) =>
        {
            cal.RemoveAnnuallyBoldedDate(new DateTime(2000, 2, 11));
            cal.UpdateBoldedDates();
        };
        btnClrAnn.Click += (s, e) =>
        {
            cal.RemoveAllAnnuallyBoldedDates();
            cal.UpdateBoldedDates();
        };

        // --- 毎月:今日と同じ「日」をトグル/全消去 ---
        btnTglMon.Click += (s, e) =>
        {
            int day = DateTime.Today.Day;
            var key = new DateTime(2000, 1, day); // 年月はダミー、日だけ有効
            bool exists = Array.Exists(cal.MonthlyBoldedDates, d => d.Day == day);
            if (exists) cal.RemoveMonthlyBoldedDate(key);
            else cal.AddMonthlyBoldedDate(key);
            cal.UpdateBoldedDates();
        };
        btnClrMon.Click += (s, e) =>
        {
            cal.RemoveAllMonthlyBoldedDates();
            cal.UpdateBoldedDates();
        };
    }

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

つまづきポイント

1) 反映されない
UpdateBoldedDates() の呼び忘れが最頻出です。複数の追加・削除をまとめて行い、最後に1回だけ呼ぶと効率的&確実。

2) 年や月は何を指定?
Annually は「月日」、Monthly は「日」だけが使用されるため、new DateTime(2000, m, d) など年はダミーでOK。ただし実在しない日付(例:2/30)は指定不可です。

3) 31日が無い月・2/29 の扱い
Monthly の 31日は、31日の無い月では表示されません。Annually の 2/29 はうるう年のみ表示されます。必要に応じて補完(最終営業日に置換など)を別ロジックで。

4) 単発太字と混在したい
単発は AddBoldedDate 系、毎年は Annually、毎月は Monthly。併用可能です。すべて設定後に UpdateBoldedDates() を1回呼ぶのがベストプラクティス。

まとめ

「毎年同じ月日」は AddAnnuallyBoldedDate/「毎月同じ日」は AddMonthlyBoldedDate。削除は Remove…RemoveAll… を用途で使い分け、最後に UpdateBoldedDates() で反映——この流れを押さえれば、繰り返しイベントのハイライトを短いコードで堅牢に運用できます。

Please follow and like us:

コメント

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