概要の説明
GcCalendar コントロールの休日設定は、HolidayStyles プロパティが参照する HolidayStyleCollection を初めとする下図のオブジェクト(着色された9つ)を使って行います。
HolidayStyleCollection コレクションには、複数の休日スタイル(複数の休日からなる集合体)を保持できます。たとえば、「国民の祝日」、「会社の休日」、「個人の休日」などを休日スタイルとして登録することで、休日を種類ごとに管理できるようになります。
休日スタイルを設定する HolidayStyle オブジェクトは、その Holidays プロパティを経由して、複数の休日を保持する HolidayCollection コレクションにアクセスします。たとえば、「国民の祝日」と名づけた休日スタイルが参照する HolidayCollection コレクションには、「1月1日、1月15日、2月11日、・・・」などの休日が含まれることになります。 Holiday オブジェクトは、休日そのものを指定するために用意されています。国民の祝日のように1日だけの休日のほかに、会社の夏期休暇などのように期間を指定した休日も設定できます。
DayOfWeekHoliday オブジェクトもHolidayオブジェクト同様、休日そのものを指定するために用意されています。Holidayオブジェクトとの違いは、ハッピーマンデーと呼ばれる成人の日、海の日、敬老の日、体育の日のように特定の月において特定の週の月曜日が祝日になるような場合に使用することができます。
ForceHoliday オブジェクトは、Holidayオブジェクトと同じように休日を指定するためのものですが、Holidayオブジェクトの休日は毎年繰り返される永続的なものなのに対し、ForceHolidayオブジェクトの休日は特定の年にだけ適用される一時的なものという違いがあります。
ForceWorkday オブジェクトは、Holidayオブジェクトの設定に関わらず、特定の日を強制的に営業日にするときに使用します。この営業日も、ForceHolidayオブジェクトの休日と同じように、特定の年に対してのみ設定することができます。
ForceDayOfWeekHoliday オブジェクトは、ForceHolidayオブジェクトと同様に特定の年にだけ適用される一時的な休日を設定しますが、特定の月、週、曜日が休日になるような場合に使用することができます。
ForceDayOfWeekWorkday オブジェクトは、ForceWorkdayオブジェクトと同様に特定の日を強制的に営業日にするときに使用しますが、特定の月、週、曜日が営業日になるような場合に使用することができます。
HolidayStyleCollection コレクションには、複数の休日スタイル(複数の休日からなる集合体)を保持できます。たとえば、「国民の祝日」、「会社の休日」、「個人の休日」などを休日スタイルとして登録することで、休日を種類ごとに管理できるようになります。
休日スタイルを設定する HolidayStyle オブジェクトは、その Holidays プロパティを経由して、複数の休日を保持する HolidayCollection コレクションにアクセスします。たとえば、「国民の祝日」と名づけた休日スタイルが参照する HolidayCollection コレクションには、「1月1日、1月15日、2月11日、・・・」などの休日が含まれることになります。 Holiday オブジェクトは、休日そのものを指定するために用意されています。国民の祝日のように1日だけの休日のほかに、会社の夏期休暇などのように期間を指定した休日も設定できます。
DayOfWeekHoliday オブジェクトもHolidayオブジェクト同様、休日そのものを指定するために用意されています。Holidayオブジェクトとの違いは、ハッピーマンデーと呼ばれる成人の日、海の日、敬老の日、体育の日のように特定の月において特定の週の月曜日が祝日になるような場合に使用することができます。
ForceHoliday オブジェクトは、Holidayオブジェクトと同じように休日を指定するためのものですが、Holidayオブジェクトの休日は毎年繰り返される永続的なものなのに対し、ForceHolidayオブジェクトの休日は特定の年にだけ適用される一時的なものという違いがあります。
ForceWorkday オブジェクトは、Holidayオブジェクトの設定に関わらず、特定の日を強制的に営業日にするときに使用します。この営業日も、ForceHolidayオブジェクトの休日と同じように、特定の年に対してのみ設定することができます。
ForceDayOfWeekHoliday オブジェクトは、ForceHolidayオブジェクトと同様に特定の年にだけ適用される一時的な休日を設定しますが、特定の月、週、曜日が休日になるような場合に使用することができます。
ForceDayOfWeekWorkday オブジェクトは、ForceWorkdayオブジェクトと同様に特定の日を強制的に営業日にするときに使用しますが、特定の月、週、曜日が営業日になるような場合に使用することができます。
休日スタイルの生成
休日スタイルは、HolidayStyle オブジェクトを使って設定します。HolidayStyleオブジェクトには、次の3つのプロパティが用意されており、これらを使って、休日スタイルに含まれているすべての休日の属性を設定することができます。
Nameプロパティには、HolidayStyleオブジェクトの内容を分かりやすく示す名称を設定します。
SubStyleプロパティは、休日の日付スタイルを設定します。日付の文字色、背景色、太字、下線を指定できます。
Holidaysプロパティは、休日そのものを保持するHolidayCollectionコレクションにアクセスするためのものです。
これらのプロパティは、次のようにしてHolidayStyleオブジェクトを生成した後に設定します。
Nameプロパティには、HolidayStyleオブジェクトの内容を分かりやすく示す名称を設定します。
SubStyleプロパティは、休日の日付スタイルを設定します。日付の文字色、背景色、太字、下線を指定できます。
Holidaysプロパティは、休日そのものを保持するHolidayCollectionコレクションにアクセスするためのものです。
これらのプロパティは、次のようにしてHolidayStyleオブジェクトを生成した後に設定します。
Imports GrapeCity.Win.Calendar ' 休日スタイルを生成します。 Dim aHS As HolidayStyle = New HolidayStyle() aHS.Name = "国民の祝日" aHS.SubStyle = New SubStyle(Color.White, Color.Red, True, False) aHS.Holidays.Add(New Holiday("誕生日", 3, 13))
using GrapeCity.Win.Calendar; // 休日スタイルを生成します。 HolidayStyle aHS = new HolidayStyle(); aHS.Name = "国民の祝日"; aHS.SubStyle = new SubStyle(Color.White, Color.Red, true, false); aHS.Holidays.Add(new Holiday("誕生日", 3, 13));
休日の追加
休日は、Holiday オブジェクトで設定します。Holidayオブジェクトは、HolidayStyleオブジェクトのHolidaysプロパティが参照するHolidayCollectionに保持されます。このHolidayオブジェクトは、次の5つの基本属性(プロパティ)を持っています。
Nameプロパティには、休日を識別するための名前を設定し、StartMonthとStartDayの2つのプロパティには休日の開始日を、また、EndMonthとEndDayの各プロパティには休日の終了日を指定します。
また、ハッピーマンデーと呼ばれる特定の月、週、曜日を指定して設定する休日は、DayOfWeekHoliday オブジェクトで設定します。このDayOfWeekHolidayオブジェクトは、次の5つの基本属性(プロパティ)を持っています。
Nameプロパティには、休日を識別するための名前を設定し、Monthには休日を設定する月、DayOfWeekInMonthには週、DayOfWeekには曜日を指定します。
Nameプロパティには、休日を識別するための名前を設定し、StartMonthとStartDayの2つのプロパティには休日の開始日を、また、EndMonthとEndDayの各プロパティには休日の終了日を指定します。
' 休日を追加します。 aHS.Holidays.Add(New Holiday("新婚旅行", 6, 28, 7, 12))
// 休日を追加します。 aHS.Holidays.Add(new Holiday("新婚旅行", 6, 28, 7, 12));
Nameプロパティには、休日を識別するための名前を設定し、Monthには休日を設定する月、DayOfWeekInMonthには週、DayOfWeekには曜日を指定します。
' 成人の日を追加します。 aHs.Holidays.Add(New DayOfWeekHoliday("成人の日",MonthFlags.January, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday)
// 成人の日を追加します。 aHs.Holidays.Add(new DayOfWeekHoliday("成人の日",MonthFlags.January, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday);
休日スタイルの適用
以上のようにして作成した休日スタイルは、HolidayStyleCollection コレクションに登録して初めて有効になります。さらに、このHolidayStyleCollectionコレクションには、複数の休日スタイルが登録されるので、どの休日スタイルをカレンダーに適用するかも指定する必要があります。
HolidayStyleCollectionコレクションへの登録は、カレンダーコントロールの HolidayStyles プロパティを経由して行います。また、休日スタイルをカレンダーに適用するには、カレンダーコントロールの ActiveHolidayStyles プロパティを使用します。
実行時に、カレンダーコントロールを右クリックすると、HolidayStyle オブジェクトの Name プロパティに設定されている休日スタイル名のリストが表示されます。さらに、リストの各項目をクリックすると、それぞれの休日スタイルの有効と無効を切り替えることができます。
HolidayStyleCollectionコレクションへの登録は、カレンダーコントロールの HolidayStyles プロパティを経由して行います。また、休日スタイルをカレンダーに適用するには、カレンダーコントロールの ActiveHolidayStyles プロパティを使用します。
実行時に、カレンダーコントロールを右クリックすると、HolidayStyle オブジェクトの Name プロパティに設定されている休日スタイル名のリストが表示されます。さらに、リストの各項目をクリックすると、それぞれの休日スタイルの有効と無効を切り替えることができます。
' コレクションに登録します。 GcCalendar1.HolidayStyles.Add("個人の休日", aHS) ' カレンダーに反映させます。 GcCalendar1.ActiveHolidayStyles = New string() {"個人の休日"}
// コレクションに登録します。 gcCalendar1.HolidayStyles.Add("個人の休日", aHS); // カレンダーに反映させます。 gcCalendar1.ActiveHolidayStyles = new string[] {"個人の休日"};
臨時の休日と営業日
上記の「休日の追加」での説明では、新婚旅行を Holiday オブジェクトに設定しましたが、これは適切ではありませんでした。通常、新婚旅行は、毎年繰り返されるものではなく、特定の年だけに行われるものです。
このように、特定の年にしか適用できないものや、年によって日付が異なるものについては、Holidayオブジェクトではなく ForceHoliday オブジェクトを使用します。下の「サンプルコード」では、次の祝日をForceHolidayオブジェクトを使って登録しています。
また、Holidayオブジェクトで設定された休日にも関わらず、その年だけは営業日になるということもあります。このような場合、ForceWorkday オブジェクトを使うことで、Holidayオブジェクトを削除することなく、臨時に営業日に設定することが可能です。
以下は、「休日スタイルの生成」で設定した誕生日(3月13日)を2013年に限って臨時営業日(仕事)にし、翌日を臨時休日(代休)に設定する例です。
このように、特定の年にしか適用できないものや、年によって日付が異なるものについては、Holidayオブジェクトではなく ForceHoliday オブジェクトを使用します。下の「サンプルコード」では、次の祝日をForceHolidayオブジェクトを使って登録しています。
- 成人の日
- 体育の日
- 春分の日
- 秋分の日
また、Holidayオブジェクトで設定された休日にも関わらず、その年だけは営業日になるということもあります。このような場合、ForceWorkday オブジェクトを使うことで、Holidayオブジェクトを削除することなく、臨時に営業日に設定することが可能です。
以下は、「休日スタイルの生成」で設定した誕生日(3月13日)を2013年に限って臨時営業日(仕事)にし、翌日を臨時休日(代休)に設定する例です。
Imports GrapeCity.Win.Calendar ' 2013年3月13日を臨時営業日(仕事)に設定します。 Dim aDateA As DateTime = DateTime.Parse("2015/5/27") GcCalendar1.HolidayStyles("個人の休日").Holidays.Add(New ForceWorkday("仕事", aDateA)) ' 2013年3月14日を臨時休日(代休)に設定します。 Dim aDateB As DateTime = DateTime.Parse("2015/5/27") GcCalendar1.HolidayStyles("個人の休日").Holidays.Add(New ForceHoliday("代休", aDateB))
using GrapeCity.Win.Calendar; // 2013年3月13日を臨時営業日(仕事)に設定します。 DateTime aDateA = DateTime.Parse("2015/5/27"); gcCalendar1.HolidayStyles["個人の休日"].Holidays.Add(new ForceWorkday("仕事", aDateA)); // 2013年3月14日を臨時休日(代休)に設定します。 DateTime aDateB = DateTime.Parse("2015/5/27"); gcCalendar1.HolidayStyles["個人の休日"].Holidays.Add(new ForceHoliday("代休", aDateB));
振替休日
国民の祝日が日曜日に重なったとき、「翌日(休日か営業日か問わず)」もしくは「次の営業日」を休日にするというシステムに対応して、カレンダーコントロールにはこの振替休日を自動的に設定する機能があります。
振替休日は、HolidayCollectionの Weekdays プロパティを経由して DayOfWeekHolidayPolicy 構造体にアクセスすることで設定できます。以下にその例を示します。
カレンダーコントロールでは、カレンダー上に表示された休日が、休日そのものか振替休日かを示すためにツールチップ機能が用意されています。
カレンダー上の振替休日にマウスカーソルが位置したときに表示するツールチップを OverrideTipText プロパティで設定できます。また、ツールチップを表示するタイミングは、TipInterval プロパティで指定します。
振替休日は、HolidayCollectionの Weekdays プロパティを経由して DayOfWeekHolidayPolicy 構造体にアクセスすることで設定できます。以下にその例を示します。
Imports GrapeCity.Win.Calendar aHS.Holidays.Weekdays.Sunday = New DayOfWeekHolidayPolicy( _ WeekFlags.All, HolidayOverride.NextWorkDay)
using GrapeCity.Win.Calendar; aHS.Holidays.Weekdays.Sunday = new DayOfWeekHolidayPolicy( WeekFlags.All, HolidayOverride.NextWorkDay);
カレンダー上の振替休日にマウスカーソルが位置したときに表示するツールチップを OverrideTipText プロパティで設定できます。また、ツールチップを表示するタイミングは、TipInterval プロパティで指定します。
休日の確認
HolidayCollectionコレクションの IsHoliday メソッドを使うと、特定の日付が休日(営業日でない日)に設定されているかどうかを確認することができます。IsHolidayメソッドがTrueを戻すのは、以下の3種類の日です。
また、HolidayCollectionコレクションの GetTypeOfDay メソッドを使うと、指定した日付が次のどれに該当するかを簡単に調べられます。
以下は、GetTypeOfDayメソッドを使って日付の種類を調べるプログラムの例です。
さらに、IHolidayインターフェイスを持つ3つのオブジェクト(Holiday、ForceHoliday、ForceWorkday)のIsHolidayメソッドとIsYearlyプロパティを調べることで、臨時営業日の内容を判別することができます。
言葉だけをみると、表の中の「通常は臨時休日(臨時休日を臨時営業日に設定する)」は無意味ですが、「臨時休日」には毎年変化する祝日(成人の日、体育の日、春分の日、秋分の日)なども含まれます。そのため、カレンダーコントロール内では意味のある設定になります。
以下は、上の表を使って日付を判別するプログラムの例です。少なくとも1つのHolidayStyleが設定されていることを前提にしています。また、休日、臨時休日、および休業日なども事前に設定しておく必要があります。
- 臨時営業日でない休日
- 臨時休日
- 休業日
また、HolidayCollectionコレクションの GetTypeOfDay メソッドを使うと、指定した日付が次のどれに該当するかを簡単に調べられます。
日付の種類 | GetTypeOfDay メソッドの戻り値 |
---|---|
営業日 | 0 - GrapeCity.Win.Calendar.DayType.Normal |
休日 | 1 - GrapeCity.Win.Calendar.DayType.Holiday |
臨時営業日 | 2 - GrapeCity.Win.Calendar.DayType.ForcedWorkday |
臨時休日 | 3 - GrapeCity.Win.Calendar.DayType.ForcedHoliday |
振替休日 | 4 - GrapeCity.Win.Calendar.DayType.OverriddenHoliday |
休業日 | 5 - GrapeCity.Win.Calendar.DayType.DayOfWeekHoliday |
以下は、GetTypeOfDayメソッドを使って日付の種類を調べるプログラムの例です。
Imports GrapeCity.Win.Calendar ' 対象の日付を設定します。 Dim aDate As DateTime = DateTime.Parse("2015/8/25") ' 日付の種類を調べます。 Dim aHS As HolidayStyle = Calendar1.HolidayStyles(GcCalendar1.ActiveHolidayStyles(0)) Dim dayInCollection As Object Debug.WriteLine(aHS.Holidays.GetTypeOfDay(aDate, dayInCollection).ToString()) ' 休日、臨時休日、臨時営業日の場合は、その名称を調べます。 If Not IsNothing(dayInCollection) Then Debug.WriteLine(CType(dayInCollection, IHoliday).Name) End If
using System.Diagnostics; using GrapeCity.Win.Calendar; // 対象の日付を設定します。 DateTime aDate = DateTime.Parse("2015/8/25"); // 日付の種類を調べます。 HolidayStyle aHS = gcCalendar1.HolidayStyles[gcCalendar1.ActiveHolidayStyles[0]]; object dayInCollection; System.Diagnostics.Debug.WriteLine(aHS.Holidays.GetTypeOfDay(aDate, out dayInCollection).ToString()); // 休日、臨時休日、臨時営業日の場合は、その名称を調べます。 if (dayInCollection != null) { System.Diagnostics.Debug.WriteLine(((IHoliday)dayInCollection).Name); }
臨時営業日の種類 | IsHoliday | IsYearly |
---|---|---|
通常は休日 | True + True | True + False |
通常は臨時休日 | True + True | False + False |
通常は休業日 | (False) + True | (False) + False |
言葉だけをみると、表の中の「通常は臨時休日(臨時休日を臨時営業日に設定する)」は無意味ですが、「臨時休日」には毎年変化する祝日(成人の日、体育の日、春分の日、秋分の日)なども含まれます。そのため、カレンダーコントロール内では意味のある設定になります。
以下は、上の表を使って日付を判別するプログラムの例です。少なくとも1つのHolidayStyleが設定されていることを前提にしています。また、休日、臨時休日、および休業日なども事前に設定しておく必要があります。
Imports GrapeCity.Win.Calendar ' チェック用の変数 Dim checkValue As Integer = 0 ' 対象の日付を設定します。 Dim aDate As DateTime = DateTime.Parse("2015/8/25") ' 各オブジェクトのIsHolidayメソッドがTrueを返したときに、 ' IsYearlyプロパティを調べます。 Dim aHS As HolidayStyle = GcCalendar1.HolidayStyles(GcCalendar1.ActiveHolidayStyles(0)) Dim item As IHoliday For Each item In aHS.Holidays If item.IsHoliday(aDate) Then checkValue += 1 If item.IsYearly Then checkValue += 3 End If Next ' 調べた結果を表示します。 Select checkValue Case 1 MessageBox.Show(aDate.ToString("yyyy年MM月dd日") + " : 通常は休業日") Case 2 MessageBox.Show(aDate.ToString("yyyy年MM月dd日") + " : 通常は臨時休日") Case 5 MessageBox.Show(aDate.ToString("yyyy年MM月dd日") + " : 通常は休日") End Select
using GrapeCity.Win.Calendar; // チェック用の変数 int checkValue = 0; // 対象の日付を設定します。 DateTime aDate = DateTime.Parse("2015/8/25"); // 各オブジェクトのIsHolidayメソッドがTrueを返したときに、 // IsYearlyプロパティを調べます。 HolidayStyle aHS = gcCalendar1.HolidayStyles[gcCalendar1.ActiveHolidayStyles[0]]; foreach (IHoliday item in aHS.Holidays) { if (item.IsHoliday(aDate)) { checkValue += 1; if (item.IsYearly) checkValue += 3; } } // 調べた結果を表示します。 switch (checkValue) { case 1: MessageBox.Show(aDate.ToString("yyyy年MM月dd日") + " : 通常は休業日"); break; case 2: MessageBox.Show(aDate.ToString("yyyy年MM月dd日") + " : 通常は臨時休日"); break; case 5: MessageBox.Show(aDate.ToString("yyyy年MM月dd日") + " : 通常は休日"); break; }
サンプルコード
次のサンプルコードは、ハッピーマンデーに対応した国民の祝日を設定しています。これらのコードは、ロジックのサンプルとしてご利用ください。
春分の日と秋分の日について
以下の処理で得られたものは、実際の祝日とは異なる可能性があります。春分の日と秋分の日は、毎年2月に翌年分が閣議決定され、官報によって公布されます。天文学に基づく計算結果とは異なる可能性があります。ハッピーマンデーについて
法律改正前の暦については、成人の日、海の日、敬老の日、体育の日が異なります。Imports GrapeCity.Win.Calendar Dim nationalHoliday As HolidayStyle = New HolidayStyle() Private Sub SetNationalHoliday() ' 2015年5月現在の国民の祝日を設定します。 ' 固定の祝日を設定します。 nationalHoliday.Name = "国民の祝日" nationalHoliday.SubStyle = New SubStyle(Color.Pink, Color.White) nationalHoliday.Holidays.Add(New Holiday("元日", 1, 1)) nationalHoliday.Holidays.Add(New Holiday("建国記念の日", 2, 11)) nationalHoliday.Holidays.Add(New Holiday("昭和の日", 4, 29)) nationalHoliday.Holidays.Add(New Holiday("憲法記念日", 5, 3)) nationalHoliday.Holidays.Add(New Holiday("みどりの日", 5, 4)) nationalHoliday.Holidays.Add(New Holiday("こどもの日", 5, 5)) nationalHoliday.Holidays.Add(New Holiday("文化の日", 11, 3)) nationalHoliday.Holidays.Add(New Holiday("勤労感謝の日", 11, 23)) nationalHoliday.Holidays.Add(New Holiday("天皇誕生日", 12, 23)) ' ハッピーマンデーを設定します。 nationalHoliday.Holidays.Add(New DayOfWeekHoliday("成人の日", MonthFlags.January, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday)) nationalHoliday.Holidays.Add(New DayOfWeekHoliday("海の日", MonthFlags.July, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday)) nationalHoliday.Holidays.Add(New DayOfWeekHoliday("敬老の日", MonthFlags.September, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday)) nationalHoliday.Holidays.Add(New DayOfWeekHoliday("体育の日", MonthFlags.October, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday)) ' 年によって変化する祝日を2015年〜2025年の分を設定します。 For I As Integer = 2015 To 2025 ' 春分の日、秋分の日を設定します。 SetYearHoliday(I) Next I ' 2016年から2099年まで、山の日を設定します。 For i As Integer = 2016 To 2099 nationalHoliday.Holidays.Add(New ForceHoliday("山の日", DateTime.Parse(i.ToString() + "/8/11"))) Next ' 振替休日の扱いを設定します。 nationalHoliday.Holidays.Weekdays.Sunday = New DayOfWeekHolidayPolicy(WeekFlags.All, HolidayOverride.NextWorkday) GcCalendar1.OverrideTipText = "振替休日" ' 休日スタイルをコレクションに追加してカレンダーに反映させます。 GcCalendar1.HolidayStyles.Add("国民の祝日", nationalHoliday) GcCalendar1.ActiveHolidayStyles = New String() {"国民の祝日"} End Sub Private Sub SetYearHoliday(ByVal Year As Integer) ' 年によって変化する国民の祝日を設定します。 Dim currentYear As Integer = Year ' 1900年から2099年までを対象としています。 ' この範囲を超えた年については、便宜的に2015年の設定をそのまま使用します。 If currentYear > 1899 AndAlso currentYear < 2100 Then Select Case currentYear Mod 4 Case 0 ' 春分の日を設定します。 If currentYear < 1960 Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))) ElseIf currentYear >= 1960 AndAlso currentYear < 2092 Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/19"))) End If ' 秋分の日を設定します。 If currentYear < 2012 Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/22"))) End If Case 1 ' 春分の日を設定します。 If currentYear < 1993 Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))) End If ' 秋分の日を設定します。 If currentYear < 1921 Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/24"))) ElseIf currentYear >= 1921 AndAlso currentYear < 2045 Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/22"))) End If Case 2 ' 春分の日を設定します。 If currentYear < 2026 Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))) End If ' 秋分の日を設定します。 If currentYear < 1950 Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/24"))) ElseIf currentYear >= 1950 AndAlso currentYear < 2078 Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/22"))) End If Case 3 ' 春分の日を設定します。 If currentYear < 1927 Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/22"))) ElseIf currentYear >= 1927 AndAlso currentYear < 2059 Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))) End If ' 秋分の日を設定します。 If currentYear < 1983 Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/24"))) Else nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))) End If End Select Else ' 2015年の春分の日を設定します。 nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))) ' 2015年の秋分の日を設定します。 nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))) End If ' 2つの祝日に挟まれた営業日を休日に設定します。 If currentYear > 2003 Then Dim Syubun As DateTime = CType(nationalHoliday.Holidays(nationalHoliday.Holidays.Count - 1), ForceHoliday).Start If Syubun.DayOfWeek = System.DayOfWeek.Wednesday Then nationalHoliday.Holidays.Add(New ForceHoliday("休日", Syubun.AddDays(-1))) End If End If End Sub
using GrapeCity.Win.Calendar; HolidayStyle nationalHoliday = new HolidayStyle(); private void SetNationalHoliday() { // 2015年5月現在の国民の祝日を設定します。 // 固定の祝日を設定します。 nationalHoliday.Name = "国民の祝日"; nationalHoliday.SubStyle = new SubStyle(Color.WhiteSmoke, Color.Red); nationalHoliday.Holidays.Add(new Holiday("元旦", 1, 1)); nationalHoliday.Holidays.Add(new Holiday("建国記念の日", 2, 11)); nationalHoliday.Holidays.Add(new Holiday("昭和の日", 4, 29)); nationalHoliday.Holidays.Add(new Holiday("憲法記念日", 5, 3)); nationalHoliday.Holidays.Add(new Holiday("みどりの日", 5, 4)); nationalHoliday.Holidays.Add(new Holiday("こどもの日", 5, 5)); nationalHoliday.Holidays.Add(new Holiday("文化の日", 11, 3)); nationalHoliday.Holidays.Add(new Holiday("勤労感謝の日", 11, 23)); nationalHoliday.Holidays.Add(new Holiday("天皇誕生日", 12, 23)); // ハッピーマンデーを設定します。 nationalHoliday.Holidays.Add(new DayOfWeekHoliday("成人の日", MonthFlags.January, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday)); nationalHoliday.Holidays.Add(new DayOfWeekHoliday("海の日", MonthFlags.July, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday)); nationalHoliday.Holidays.Add(new DayOfWeekHoliday("敬老の日", MonthFlags.September, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday)); nationalHoliday.Holidays.Add(new DayOfWeekHoliday("体育の日", MonthFlags.October, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday)); // 年によって変化する祝日を2015年〜2025年の分を設定します。 for (int i = 2015; i < 2025; i++) { SetYearHoliday(i); } // 2016年から2099年まで、山の日を設定します。 for (int i = 2016; i < 2099; i++) { nationalHoliday.Holidays.Add(new ForceHoliday("山の日", DateTime.Parse(i.ToString() + "/8/11"))); } // 振替休日の扱いを設定します。 nationalHoliday.Holidays.Weekdays.Sunday = new DayOfWeekHolidayPolicy(WeekFlags.All, HolidayOverride.NextWorkDay); gcCalendar1.OverrideTipText = "振替休日"; // 休日スタイルをコレクションに追加してカレンダーに反映させます。 gcCalendar1.HolidayStyles.Add("国民の祝日", nationalHoliday); gcCalendar1.ActiveHolidayStyles = new string[] { "国民の祝日" }; } private void SetYearHoliday(int Year) { // 年によって変化する国民の祝日を設定します。 int currentYear = Year; // 1900年から2099年までを対象としています。 // この範囲を超えた年については、便宜的に2013年の設定をそのまま使用します。 if (currentYear > 1899 && currentYear < 2100) { switch (currentYear % 4) { case 0: // 春分の日を設定します。 if (currentYear < 1960) { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))); } else if (currentYear >= 1960 && currentYear < 2092) { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/19"))); } // 秋分の日を設定します。 if (currentYear < 2012) { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/22"))); } break; case 1: // 春分の日を設定します。 if (currentYear < 1993) { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))); } // 秋分の日を設定します。 if (currentYear < 1921) { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/24"))); } else if (currentYear >= 1921 && currentYear < 2045) { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/22"))); } break; case 2: // 春分の日を設定します。 if (currentYear < 2026) { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))); } // 秋分の日を設定します。 if (currentYear < 1950) { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/24"))); } else if (currentYear >= 1950 && currentYear < 2078) { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/22"))); } break; case 3: // 春分の日を設定します。 if (currentYear < 1927) { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/22"))); } else if (currentYear >= 1927 && currentYear < 2059) { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/20"))); } // 秋分の日を設定します。 if (currentYear < 1983) { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/24"))); } else { nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))); } break; } } else { // 2015年の春分の日を設定します。 nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse(currentYear.ToString() + "/3/21"))); // 2015年の秋分の日を設定します。 nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse(currentYear.ToString() + "/9/23"))); } // 2つの祝日に挟まれた営業日を休日に設定します。 if (currentYear > 2003) { DateTime Syubun = ((ForceHoliday)nationalHoliday.Holidays[nationalHoliday.Holidays.Count - 1]).Start; if (Syubun.DayOfWeek == System.DayOfWeek.Wednesday) { nationalHoliday.Holidays.Add(new ForceHoliday("休日", Syubun.AddDays(-1))); } } }