PowerTools MultiRow for Windows Forms 8.0J
休日の設定

GcCalendarCellで休日を設定する方法について解説します。
概要の説明
GcCalendarCellの休日設定は、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オブジェクトと同様に特定の日を強制的に営業日にするときに使用しますが、特定の月、週、曜日が営業日になるような場合に使用することができます。
休日スタイルの生成
休日スタイルは、HolidayStyleオブジェクトを使って設定します。HolidayStyleオブジェクトには、次の3つのプロパティが用意されており、これらを使って、休日スタイルに含まれているすべての休日の属性を設定することができます。


Nameプロパティには、HolidayStyleオブジェクトの内容を分かりやすく示す名称を設定します。
SubStyleプロパティは、休日の日付スタイルを設定します。日付の文字色、背景色、太字、下線を指定できます。
Holidaysプロパティは、休日そのものを保持するHolidayCollectionコレクションにアクセスするためのものです。


これらのプロパティは、次のようにしてHolidayStyleオブジェクトを生成した後に設定します。

Imports PlusPakCell = GrapeCity.Win.MultiRow.PlusPak

' 休日スタイルを生成します。 
Dim aHS As PlusPakCell.HolidayStyle = New PlusPakCell.HolidayStyle()
aHS.Name = "国民の祝日"
aHS.SubStyle = New PlusPakCell.SubStyle(Color.White, Color.Red, True, False)
aHS.Holidays.Add(New PlusPakCell.Holiday("誕生日", 3, 13))
using PlusPakCell = GrapeCity.Win.MultiRow.PlusPak;

// 休日スタイルを生成します。
PlusPakCell.HolidayStyle aHS = new PlusPakCell.HolidayStyle();
aHS.Name = "国民の祝日";
aHS.SubStyle = new PlusPakCell.SubStyle(Color.White, Color.Red, true, false);
aHS.Holidays.Add(new PlusPakCell.Holiday("誕生日", 3, 13));
休日の追加
休日は、Holidayオブジェクトで設定します。Holidayオブジェクトは、HolidayStyleオブジェクトのHolidaysプロパティが参照するHolidayCollectionに保持されます。このHolidayオブジェクトは、次の5つの基本属性(プロパティ)を持っています。
Nameプロパティには、休日を識別するための名前を設定し、StartMonthとStartDayの2つのプロパティには休日の開始日を、また、EndMonthとEndDayの各プロパティには休日の終了日を指定します。

' 休日を追加します。 
aHS.Holidays.Add(New PlusPakCell.Holiday("新婚旅行", 6, 28, 7, 12))
// 休日を追加します。
aHS.Holidays.Add(new PlusPakCell.Holiday("新婚旅行", 6, 28, 7, 12));
また、ハッピーマンデーと呼ばれる特定の月、週、曜日を指定して設定する休日は、DayOfWeekHolidayオブジェクトで設定します。このDayOfWeekHolidayオブジェクトは、次の5つの基本属性(プロパティ)を持っています。

Nameプロパティには、休日を識別するための名前を設定し、Monthには休日を設定する月、DayOfWeekInMonthには週、DayOfWeekには曜日を指定します。

' 成人の日を追加します。
aHS.Holidays.Add(New PlusPakCell.DayOfWeekHoliday(
                 "成人の日",
                 GrapeCity.Win.Calendar.MonthFlags.January,
                 GrapeCity.Win.Calendar.DayOfWeekInMonthFlags.Second,
                 GrapeCity.Win.Calendar.DayOfWeekFlags.Monday))
   // 成人の日を追加します。
aHS.Holidays.Add(new PlusPakCell.DayOfWeekHoliday(
    "成人の日", 
    GrapeCity.Win.Calendar.MonthFlags.January, 
    GrapeCity.Win.Calendar.DayOfWeekInMonthFlags.Second, 
    GrapeCity.Win.Calendar.DayOfWeekFlags.Monday));
休日スタイルの適用
以上のようにして作成した休日スタイルは、HolidayStyleCollectionコレクションに登録して初めて有効になります。さらに、このHolidayStyleCollectionコレクションには、複数の休日スタイルが登録されるので、どの休日スタイルをカレンダーに適用するかも指定する必要があります。

HolidayStyleCollectionコレクションへの登録は、GcCalendarCellのHolidayStylesプロパティを経由して行います。また、休日スタイルをカレンダーに適用するには、GcCalendarCellのActiveHolidayStylesプロパティを使用します。

実行時に、GcCalendarCellを右クリックすると、HolidayStyleオブジェクトのNameプロパティに設定されている休日スタイル名のリストが表示されます。さらに、リストの各項目をクリックすると、それぞれの休日スタイルの有効と無効を切り替えることができます。

Dim GcCalendarCell1 = New PlusPakCell.GcCalendarCell()

' コレクションに登録します。 
GcCalendarCell1.HolidayStyles.Add("個人の休日", aHS)

' カレンダーに反映させます。 
GcCalendarCell1.ActiveHolidayStyles = New String() {"個人の休日"}

GcMultiRow1.Template = Template.CreateGridTemplate(New Cell() {GcCalendarCell1})
GcMultiRow1.RowCount = 10
PlusPakCell.GcCalendarCell gcCalendarCell1 = new PlusPakCell.GcCalendarCell();

// コレクションに登録します。 
gcCalendarCell1.HolidayStyles.Add("個人の休日", aHS);

// カレンダーに反映させます。 
gcCalendarCell1.ActiveHolidayStyles = new string[] { "個人の休日" };

gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] { gcCalendarCell1 });
gcMultiRow1.RowCount = 10;
臨時の休日と営業日
上記の「休日の追加」での説明では、新婚旅行をHolidayオブジェクトに設定しましたが、これは適切ではありませんでした。通常、新婚旅行は、毎年繰り返されるものではなく、特定の年だけに行われるものです。

このように、特定の年にしか適用できないものや、年によって日付が異なるものについては、HolidayオブジェクトではなくForceHolidayオブジェクトを使用します。下の「サンプルコード」では、次の祝日をForceHolidayオブジェクトを使って登録しています。
  • 成人の日
  • 体育の日
  • 春分の日
  • 秋分の日


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

以下は、「休日スタイルの生成」で設定した誕生日(10月1日)を2015年に限って臨時営業日(仕事)にし、翌日を臨時休日(代休)に設定する例です。

Imports GrapeCity.Win.MultiRow
Imports PlusPakCell = GrapeCity.Win.MultiRow.PlusPak

' 2013年3月13日を臨時営業日(仕事)に設定します。 
Dim aDateA As DateTime = DateTime.Parse("2015/10/1")
GcCalendarCell1.HolidayStyles("個人の休日").Holidays.Add(New PlusPakCell.ForceWorkday("仕事", aDateA))

' 2013年3月14日を臨時休日(代休)に設定します。 
Dim aDateB As DateTime = DateTime.Parse("2015/10/2")
GcCalendarCell1.HolidayStyles("個人の休日").Holidays.Add(New PlusPakCell.ForceHoliday("代休", aDateB))
using GrapeCity.Win.MultiRow;
using PlusPakCell = GrapeCity.Win.MultiRow.PlusPak;

// 2013年3月17日を臨時営業日(仕事)に設定します。
DateTime aDateA = DateTime.Parse("2015/10/1");
gcCalendarCell1.HolidayStyles["個人の休日"].Holidays.Add(new PlusPakCell.ForceWorkday("仕事", aDateA));

// 2013年3月18日を臨時休日(代休)に設定します。
DateTime aDateB = DateTime.Parse("2015/10/2");
gcCalendarCell1.HolidayStyles["個人の休日"].Holidays.Add(new PlusPakCell.ForceHoliday("代休", aDateB));
振替休日
国民の祝日が日曜日に重なったとき、「翌日(休日か営業日か問わず)」もしくは「次の営業日」を休日にするというシステムに対応してGcCalendarCellには、この振替休日を自動的に設定する機能があります。

振替休日は、HolidayCollectionのWeekdaysプロパティを経由してDayOfWeekHolidayPolicy構造体にアクセスすることで設定できます。以下にその例を示します。

aHS.Holidays.Weekdays.Sunday = New GrapeCity.Win.Calendar.DayOfWeekHolidayPolicy(
    GrapeCity.Win.Calendar.WeekFlags.All, GrapeCity.Win.Calendar.HolidayOverride.NextWorkDay)
aHS.Holidays.Weekdays.Sunday = new GrapeCity.Win.Calendar.DayOfWeekHolidayPolicy(
    GrapeCity.Win.Calendar.WeekFlags.All, GrapeCity.Win.Calendar.HolidayOverride.NextWorkDay);
GcCalendarCellでは、GcCalendarEditingControl.OverrideTipTextプロパティを使用して、カレンダー上に表示された休日が、休日そのものか振替休日かを示すツールチップ機能を利用できます。

カレンダーがフォーカスを持っているときに、カレンダー上の振替休日にマウスカーソルが位置したときにツールチップを表示します。また、ツールチップを表示するタイミングはGcCalendarEditingControl.TipIntervalプロパティで指定します。
Private Sub GcMultiRow1_EditingControlShowing(ByVal sender As Object, ByVal e As GrapeCity.Win.MultiRow.EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing
    Dim gcCalendarEditor As PlusPakCell.GcCalendarEditingControl = TryCast(e.Control, PlusPakCell.GcCalendarEditingControl)
    If gcCalendarEditor IsNot Nothing Then

        ' 振替休日のツールチップのテキストを設定します。
        gcCalendarEditor.OverrideTipText = "振替休日"
        gcCalendarEditor.TipInterval = 1000
    End If
End Sub
private void gcMultiRow1_EditingControlShowing(object sender, EditingControlShowingEventArgs e)
{
    PlusPakCell.GcCalendarEditingControl gcCalendarEditor = (e.Control as PlusPakCell.GcCalendarEditingControl);

    if (gcCalendarEditor != null)
    {
        // 振替休日のツールチップのテキストを設定します。
        gcCalendarEditor.OverrideTipText = "振替休日";
        gcCalendarEditor.TipInterval = 1000;
    }
}
   
参照

 

 


© 2008-2015 GrapeCity inc. All rights reserved.