リサイズはクリックかドラッグ

休日を設定する

このトピックでは、ドロップダウンカレンダーコントロールで休日を設定する方法について解説します。

概要の説明

ドロップダウンカレンダーの休日設定は、HolidaySetting プロパティが参照する HolidayGroup を初めとする下図のオブジェクト(着色された8つ)を使って行います。

休日の設定で使用するオブジェクト
(図): 休日の設定で使用するオブジェクト

HolidayGroup オブジェクトは複数の休日設定を1つのグループとして管理します。休日設定とは複数の休日からなる集合体を表し、例えば「国民の祝日」、「会社の休日」、「個人の休日」などをそれぞれ休日設定として登録することで、休日を種類ごとに管理できるようになります。

HolidaySetting オブジェクトは単一の休日設定を表します。

Holiday オブジェクトは、休日そのものを指定するために用意されています。国民の祝日のように1日だけの休日のほかに、会社の夏期休暇などのように期間を指定した休日も設定できます。

DayOfWeekHoliday オブジェクトも Holiday オブジェクト同様、休日そのものを指定するために用意されています。Holiday オブジェクトとの違いは、ハッピーマンデーと呼ばれる成人の日、海の日、敬老の日、体育の日のように特定の月において特定の週の月曜日が祝日になるような場合に使用することができます。

ForceHoliday オブジェクトは、Holiday オブジェクトと同じように休日を指定するためのものですが、Holiday オブジェクトの休日は毎年繰り返される永続的なものなのに対し、ForceHoliday オブジェクトの休日は特定の年にだけ適用される一時的なものという違いがあります。

ForceWorkday オブジェクトは、Holiday オブジェクトの設定に関わらず、特定の日を強制的に営業日にするときに使用します。この営業日も、ForceHoliday オブジェクトの休日と同じように、特定の年に対してのみ設定することができます。

ForceDayOfWeekHoliday オブジェクトは、ForceHoliday オブジェクトと同様に特定の年にだけ適用される一時的な休日を設定しますが、特定の月、週、曜日が休日になるような場合に使用することができます。

ForceDayOfWeekWorkday オブジェクトは、ForceHoliday オブジェクトと同様に特定の日を強制的に営業日にするときに使用しますが、特定の月、週、曜日が営業日になるような場合に使用することができます。

休日設定の生成

休日の設定は、HolidaySetting オブジェクトを使用して行います。HolidaySetting オブジェクトには、次の3つのプロパティが用意されています。

プロパティ名説明
HolidaySettingNameHolidaySetting オブジェクトの内容を分かりやすく示す名称を設定します。
Holidays休日そのものを保持する HolidayCollection オブジェクトへの参照を返します。
IsActiveこの休日設定をアクティブにするかどうかを示す値を設定します。

HolidaySettingName プロパティの値は、日付領域に対してスタイルを設定する際、PropertyCondition オブジェクトによる条件定義で使用できます。

以下のサンプルコードは、「個人の休日」という名前の休日設定を追加し、その休日に該当する日の背景色を黄色で描画します。

using GrapeCity.Windows.InputMan;

// 休日設定を作成します。
var setting = new HolidaySetting("個人の休日");
setting.Holidays.Add(new Holiday("誕生日", 10, 1));
GcDropDownCalendar1.HolidaySetting = setting;

// 「個人の休日」に該当する日付に対するスタイルを設定します。
var condition = new PropertyCondition() { Property = "HolidaySettingName", Value = "個人の休日" };
condition.Setters.Add(new SelectorSetter() { Property = "Background", Value = "Yellow" });
var selector = new CalendarDayButtonStyleSelector();
selector.Conditions.Add(condition);
GcDropDownCalendar1.CalendarDayButtonStyleSelector = selector;
休日の追加

休日は、Holiday オブジェクトで設定します。Holiday オブジェクトは、HolidaySetting オブジェクトの Holidays プロパティが参照する HolidayCollection に保持されます。この Holiday オブジェクトは、次の6つの基本属性(プロパティ)を持っています。

プロパティ名説明
HolidayNameHoliday オブジェクトの内容を分かりやすく示す名称を設定します。
StartMonth休日の開始月を設定します。
StartDayStartMonth プロパティで設定した月における開始日を設定します。
EndMonth休日の終了月を設定します。
EndDayEndMonth プロパティで設定した月における終了日を設定します。
IsYearly毎年発生する休日かどうかを示す値を取得します。Holiday オブジェクトでは常に True を返します。

以下のサンプルコードは、Holiday オブジェクトを使用して休日を設定する例です。

using GrapeCity.Windows.InputMan;

var setting = new HolidaySetting();
setting.Holidays.Add(new Holiday("新婚旅行", 6, 28, 7, 12));
GcDropDownCalendar1.HolidaySetting = setting;

また、ハッピーマンデーと呼ばれる特定の月、週、曜日を指定して設定する休日は、DayOfWeekHoliday オブジェクトで設定します。この DayOfWeekHoliday オブジェクトは、次の5つの基本属性(プロパティ)を持っています。

プロパティ名説明
HolidayNameDayOfWeekHoliday オブジェクトの内容を分かりやすく示す名称を設定します。
Month休日の対象となる月を設定します。
WeekInMonthMonth プロパティで設定した月における、休日の対象となる週を設定します。
DayOfWeek休日の対象となる曜日を設定します。
IsYearly毎年発生する休日かどうかを示す値を取得します。DayOfWeekHoliday オブジェクトでは常に True を返します。

以下のサンプルコードは、DayOfWeekHoliday オブジェクトを使用して休日を設定する例です。

using GrapeCity.Windows.InputMan;

var setting = new HolidaySetting();
setting.Holidays.Add(new DayOfWeekHoliday("成人式", Months.January, Weeks.SecondWeek, DayOfWeeks.Monday));
GcDropDownCalendar1.HolidaySetting = setting;
臨時の休日と営業日

上記の「休日の追加」での説明では、新婚旅行を Holiday オブジェクトに設定しましたが、これは適切ではありませんでした。通常、新婚旅行は、毎年繰り返されるものではなく、特定の年だけに行われるものです。このように、特定の年にしか適用できないものや、年によって日付が異なるものについては、Holiday オブジェクトではなく ForceHoliday オブジェクトを使用します。

また、Holiday オブジェクトで設定された休日にも関わらず、その年だけは営業日になるということもあります。このような場合、ForceWorkday オブジェクトを使うことで、Holiday オブジェクトを削除することなく、臨時に営業日に設定することが可能です。

以下のサンプルコードは、Holiday オブジェクトで設定した誕生日(10月1日)を2018年に限って臨時営業日(仕事)にし、翌日を臨時休日(代休)に設定する例です。

using GrapeCity.Windows.InputMan;

// 休日設定を作成します。
var setting = new HolidaySetting("個人の休日");
setting.Holidays.Add(new Holiday("誕生日", 10, 1));
GcDropDownCalendar1.HolidaySetting = setting;

// 2018年10月1日を臨時営業日(仕事)に設定します。 
setting.Holidays.Add(new ForceWorkday("仕事", new DateTime(2018,10,1)));

// 2018年10月2日を臨時休日(代休)に設定します。
setting.Holidays.Add(new ForceHoliday("代休", new DateTime(2018, 10, 2)));
振替休日

国民の祝日が日曜日に重なったとき、「翌日(休日か営業日か問わず)」もしくは「次の営業日」を休日にするというシステムに対応して、ドロップダウンカレンダーには、この振替休日を自動的に設定する機能があります。

振替休日に関する設定は、WeeklyHoliday オブジェクトの HolidayOverridePolicy プロパティで設定します。この WeeklyHoliday オブジェクトは休業日(毎週の定期的な休み)を設定するもので、次の5つの基本属性(プロパティ)を持っています。

プロパティ名説明
HolidayNameWeeklyHoliday オブジェクトの内容を分かりやすく示す名称を設定します。
WeekInMonth休日が発生する月における、処理対象となる週を設定します。
DayOfWeek休日が発生する曜日を設定します。
HolidayOverridePolicy振替休日のポリシーを設定します。
IsYearly毎年発生する休日かどうかを示す値を取得します。

以下のサンプルコードは、日曜日に対して振替休日のポリシーを設定します。

using GrapeCity.Windows.InputMan;

// 休日設定を作成します。
var setting = new HolidaySetting();
setting.Holidays.Add(new Holiday("創立記念日", 10, 1));
GcDropDownCalendar1.HolidaySetting = setting;

// 日曜日に対する振替休日ポリシーを設定します。
setting.Holidays.Add(new WeeklyHoliday(){ HolidayName = "振替休日", DayOfWeek = System.DayOfWeek.Sunday, HolidayOverridePolicy = HolidayOverridePolicy.NextWorkday});
休日の確認

HolidayCollection オブジェクトの IsHoliday メソッドを使うと、特定の日付が休日(営業日でない日)に設定されているかどうかを確認することができます。IsHoliday メソッドが True を戻すのは、以下の3種類の日です。

  • 臨時営業日でない休日
  • 臨時休日
  • 休業日

また、HolidayCollection オブジェクトの GetTypeOfDay メソッドを使うと、指定した日付が次のどれに該当するかを簡単に調べられます。

戻り値日付の種類
DayType.Normal営業日
DayType.Holiday休日
DayType.ForcedWorkday臨時営業日
DayType.ForcedHoliday臨時休日
DayType.OverriddenHoliday振替休日
DayType.WeeklyHoliday休業日

以下のサンプルコードは、GetTypeOfDay メソッドを使って、クリックされた日付の種類を調べるプログラムの例です。

using GrapeCity.Windows.InputMan;

private void GcDropDownCalendar1_ClickDate(object sender, ClickDateEventArgs e)
{
    IHoliday dayInCollection = null;

    HolidaySetting setting = GcDropDownCalendar1.HolidaySetting as HolidaySetting;
    if (setting != null)
    {
        // 日付の種類を調べます。 
        var value = setting.Holidays.GetTypeOfDay(e.Date, out dayInCollection);
        MessageBox.Show(value.ToString());

        // 休日、臨時休日、臨時営業日の場合は、その名称を調べます。 
        if (dayInCollection != null)
        {
            if (value != DayType.OverriddenHoliday)
                MessageBox.Show(dayInCollection.HolidayName);
            else
                MessageBox.Show("振替休日");
        }
    }
}
複数の休日設定を定義する

国民の休日と会社の休業日を同時に設定するなど、カレンダーに対して複数の休日設定を定義する場合は、HolidayGroup オブジェクトを使用します。HolidayGroup オブジェクトは HolidaySetting オブジェクトのコレクションとして動作し、複数の休日設定を1つのグループとして管理します。

以下のサンプルコードは、毎週日曜日の定休日と 12/28~1/4 までの年末年始休業日を1つのグループとして定義します。

using GrapeCity.Windows.InputMan;

// 「定休日」休日設定を定義します。
var setting1 = new HolidaySetting("定休日");
setting1.Holidays.Add(new DayOfWeekHoliday(Months.All, Weeks.All, DayOfWeeks.Sunday));

// 「年末年始休業日」休日設定を定義します。
var setting2 = new HolidaySetting("年末年始休業日");
setting2.Holidays.Add(new Holiday(12, 28, 12, 31));
setting2.Holidays.Add(new Holiday(1, 1, 1, 4));

// 「休業日」グループを定義します。
var group = new HolidayGroup("休業日");
group.Children.Add(setting1);
group.Children.Add(setting2);

// GcDropDownCalendar コントロールに休日設定を適用します。
GcDropDownCalendar1.HolidaySetting = group;
サンプルコード

次のサンプルコードは、ハッピーマンデーに対応した国民の祝日を設定しています。これらのコードは、ロジックのサンプルとしてご利用ください。

メモ メモ

XAML サンプルコードは、製品に収録されている祝日定義ファイルの内容と同じものです。祝日定義ファイルの使用方法については「祝日定義ファイルを利用する」を参照してください。

春分の日と秋分の日について

以下の処理で得られたものは、実際の祝日とは異なる可能性があります。春分の日と秋分の日は、毎年2月に翌年分が閣議決定され、官報によって公布されます。天文学に基づく計算結果とは異なる可能性があります。

ハッピーマンデーについて

法律改正前の暦については、成人の日、海の日、敬老の日、体育の日が異なります。

using GrapeCity.Windows.InputMan;

HolidaySetting nationalHoliday = new HolidaySetting("国民の休日");
HolidaySetting normalday = new HolidaySetting("通常日");
HolidayGroup nationalHolidayGroup = new HolidayGroup("国民の祝日");

private void SetNationalHoliday()
{
    // 2019年4月現在の国民の祝日を設定します。 
    // 固定の祝日を設定します。
    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 DayOfWeekHoliday("成人の日", Months.January, Weeks.SecondWeek, DayOfWeeks.Monday));
    nationalHoliday.Holidays.Add(new DayOfWeekHoliday("海の日", Months.July, Weeks.ThirdWeek, DayOfWeeks.Monday));
    nationalHoliday.Holidays.Add(new DayOfWeekHoliday("敬老の日", Months.September, Weeks.ThirdWeek, DayOfWeeks.Monday));
    nationalHoliday.Holidays.Add(new DayOfWeekHoliday("体育の日", Months.October, Weeks.SecondWeek, DayOfWeeks.Monday));

    // 天皇即位にともなう休日を設定します。
    nationalHoliday.Holidays.Add(new ForceHoliday("休日", DateTime.Parse("2019/4/30")));
    nationalHoliday.Holidays.Add(new ForceHoliday("休日", DateTime.Parse("2019/5/1")));
    nationalHoliday.Holidays.Add(new ForceHoliday("休日", DateTime.Parse("2019/5/2")));
    nationalHoliday.Holidays.Add(new ForceHoliday("休日", DateTime.Parse("2019/10/22")));

    // 2020年の東京オリンピック・東京パラリンピックにともなう休日を設定します。
    nationalHoliday.Holidays.Add(new ForceHoliday("海の日", DateTime.Parse("2020/7/23")));
    nationalHoliday.Holidays.Add(new ForceHoliday("スポーツの日", DateTime.Parse("2020/7/24")));
    nationalHoliday.Holidays.Add(new ForceHoliday("山の日", DateTime.Parse("2020/8/10")));

    // 2020年の「7月20日」「10月12日」を通常日に設定します。
    normalday.Holidays.Add(new ForceWorkday("", DateTime.Parse("2020/7/20")));
    normalday.Holidays.Add(new ForceWorkday("", DateTime.Parse("2020/10/12")));
    //normalday.Holidays.Add(new ForceDayOfWeekWorkday(2020, Months.July, Weeks.ThirdWeek, DayOfWeeks.Monday));
    //normalday.Holidays.Add(new ForceDayOfWeekWorkday(2020, Months.October, Weeks.SecondWeek, DayOfWeeks.Monday));

    // 1900年~2099年の間で年ごとに変化する祝日を設定します。 
    for (int i = 1900; i <= 2099; i++)
    {
        SetYearHoliday(i);
    }

    // 振替休日の扱いを設定します。
    var weeklyHoliday = new WeeklyHoliday();
    weeklyHoliday.HolidayName = "振替休日";
    weeklyHoliday.DayOfWeek = System.DayOfWeek.Sunday;
    weeklyHoliday.HolidayOverridePolicy = HolidayOverridePolicy.NextWorkday;
    weeklyHoliday.WeekInMonth = Weeks.All;
    nationalHoliday.Holidays.Add(weeklyHoliday);

    nationalHolidayGroup.Children.Add(nationalHoliday);
    nationalHolidayGroup.Children.Add(normalday);

    // 休日スタイルをコレクションに追加してカレンダーに反映させます。 
    GcDropDownCalendar1.HolidaySetting = nationalHolidayGroup;
}

private void SetYearHoliday(int year)
{
    // 年によって変化する国民の祝日を設定します。 
    int currentYear = year;

    // 春分の日と秋分の日の初期値として2019年の祝日を設定します。
    DateTime syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
    DateTime syubun = DateTime.Parse(currentYear.ToString() + "/9/23");

    switch (currentYear % 4)
    {
        case 0:
            // 春分の日を設定します。
            if (currentYear < 1960)
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
            }
            else if (currentYear >= 1960 && currentYear < 2092)
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
            }
            else
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/19");
            }
            // 秋分の日を設定します。
            if (currentYear < 2012)
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
            }
            else
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/22");
            }
            break;
        case 1:
            // 春分の日を設定します。
            if (currentYear < 1993)
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
            }
            else
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
            }
            // 秋分の日を設定します。
            if (currentYear < 1921)
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/24");
            }
            else if (currentYear >= 1921 && currentYear < 2045)
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
            }
            else
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/22");
            }
            break;
        case 2:
            // 春分の日を設定します。
            if (currentYear < 2026)
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
            }
            else
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
            }
            // 秋分の日を設定します。
            if (currentYear < 1950)
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/24");
            }
            else if (currentYear >= 1950 && currentYear < 2078)
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
            }
            else
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/22");
            }
            break;
        case 3:
            // 春分の日を設定します。
            if (currentYear < 1927)
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/22");
            }
            else if (currentYear >= 1927 && currentYear < 2059)
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
            }
            else
            {
                syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
            }
            // 秋分の日を設定します。
            if (currentYear < 1983)
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/24");
            }
            else
            {
                syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
            }
            break;
    }

    // 春分の日を設定します。
    nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", syunbun));
    // 秋分の日を設定します。
    nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", syubun));

    // 2つの祝日に挟まれた営業日を休日に設定します。
    if (currentYear > 2003)
    {
        if (syubun.DayOfWeek == System.DayOfWeek.Wednesday)
        {
            nationalHoliday.Holidays.Add(new ForceHoliday("休日", syubun.AddDays(-1)));
        }
    }

    // 天皇誕生日を設定します。
    if (currentYear > 1988)
    {
        if (currentYear < 2019) nationalHoliday.Holidays.Add(new ForceHoliday("天皇誕生日", DateTime.Parse(currentYear.ToString() + "/12/23")));
        if (currentYear > 2019) nationalHoliday.Holidays.Add(new ForceHoliday("天皇誕生日", DateTime.Parse(currentYear.ToString() + "/2/23")));
    }

    // 2016年以降、山の日を設定します。
    if (currentYear > 2015 && currentYear != 2020)
    {
        nationalHoliday.Holidays.Add(new ForceHoliday("山の日", DateTime.Parse(currentYear.ToString() + "/8/11")));
    }
}
参照