はじめに
本記事では、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() で反映——この流れを押さえれば、繰り返しイベントのハイライトを短いコードで堅牢に運用できます。
コメント