PowerTools SPREAD for Windows Forms 10.0J
ドロップダウンカレンダー(GcDateTime型セル)

GcDateTime型セルは、ドロップダウンカレンダーを搭載しています。ここではドロップダウンカレンダーの機能について説明します。

ドロップダウンカレンダーは、視覚的な日付入力を可能にする入力補助機能ですが、カレンダーの外観を自由に設定できるほか、休日の登録といったカスタマイズが可能です。カレンダーの動作やカレンダーの外観、休日設定は行うには、DropDownCalendar プロパティが参照するDropDownCalendarInfo オブジェクトを使用します。

ドロップダウンカレンダーを表示する

ドロップダウンカレンダーを表示するには、次の方法があります。

ドロップダウンボタンでドロップダウンカレンダーを表示する場合は、DropDownInfo オブジェクトのIsDefaultBehavior プロパティがTrueに設定されていることが必要です。詳細は、サイドボタンを参照してください。

サンプルコード

次のサンプル コードは、GcDateTimeセルにドロップダウンボタンを設定する方法です。

C#
コードのコピー
using InputManCell = GrapeCity.Win.Spread.InputMan.CellType;

// GcDateTimeセルにドロップダウンボタンを追加
InputManCell.GcDateTimeCellType gdt = new InputManCell.GcDateTimeCellType();
gdt.SideButtons.Add(new InputManCell.DropDownButtonInfo());
fpSpread1.ActiveSheet.Cells[0, 0].CellType = gdt;
Visual Basic
コードのコピー
Imports InputManCell = GrapeCity.Win.Spread.InputMan.CellType

' GcDateTimeセルにドロップダウンボタンを追加
Dim gdt As New InputManCell.GcDateTimeCellType
gdt.SideButtons.Add(New InputManCell.DropDownButtonInfo())
FpSpread1.ActiveSheet.Cells(0, 0).CellType = gdt
基点と期間の設定

カレンダーの最初の列に表示する曜日は、FirstDayOfWeek プロパティで設定します。通常のカレンダーでは、日曜日または月曜日が最初の列に表示されます。なお、デフォルトでは、週の開始曜日はシステムから取得されます。

12か月分のカレンダーを表示している場合に、左上に配置する最初の月は、FirstMonthInView プロパティで設定します。FirstMonthInView プロパティをMonths.Default以外に設定すると、指定した月が左上に表示されます。ナビゲータのスキップボタンをクリックするか、またはマウスでドラッグすると、ScrollRate プロパティの設定にかかわらず、常に1回の操作につき1年分のカレンダーがスクロールされます。コントロール内に表示される最初の月はどんな場合にも変更されません。

カレンダーに表示する日付の最小値と最大値は、MinDate プロパティとMaxDate プロパティで設定します。この最小値と最大値を超える日付には、フォーカスを移動することはできません。

休日の設定

ドロップダウンカレンダーの休日設定は、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クラスのインスタンスを作成し、クラスのプロパティを設定します。

C#
コードのコピー
using InputManCell = GrapeCity.Win.Spread.InputMan.CellType;

// 休日スタイルを生成します。
InputManCell.HolidayStyle aHS = new InputManCell.HolidayStyle();
aHS.Name = "国民の祝日";
aHS.SubStyle = new InputManCell.SubStyle(Color.White, Color.Red, true, false);
aHS.Holidays.Add(new InputManCell.Holiday("誕生日", 10, 1));
Visual Basic
コードのコピー
Imports InputManCell = GrapeCity.Win.Spread.InputMan.CellType

' 休日スタイルを生成します。
Dim aHS As InputManCell.HolidayStyle = New InputManCell.HolidayStyle()
aHS.Name = "国民の祝日"
aHS.SubStyle = New InputManCell.SubStyle(Color.White, Color.Red, True, False)
aHS.Holidays.Add(New InputManCell.Holiday("誕生日", 10, 1))
休日の追加

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

Name プロパティには、休日を識別するための名前を設定し、StartMonthとStartDayの2つのプロパティには休日の開始日を、また、EndMonthとEndDayの各プロパティには休日の終了日を指定します。

サンプルコード

C#
コードのコピー
// 休日を追加します。
aHS.Holidays.Add(new InputManCell.Holiday("新婚旅行", 6, 28, 7, 12));
Visual Basic
コードのコピー
' 休日を追加します。
aHS.Holidays.Add(New InputManCell.Holiday("新婚旅行", 6, 28, 7, 12))

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

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

サンプルコード

C#
コードのコピー
// 成人の日を追加します。
aHS.Holidays.Add(new InputManCell.DayOfWeekHoliday("成人の日",InputManCell.MonthFlags.January, InputManCell.DayOfWeekInMonthFlags.Second, InputManCell.DayOfWeekFlags.Monday));
Visual Basic
コードのコピー
' 成人の日を追加します。
aHS.Holidays.Add(New InputManCell.DayOfWeekHoliday("成人の日",InputManCell.MonthFlags.January, InputManCell.DayOfWeekInMonthFlags.Second, InputManCell.DayOfWeekFlags.Monday))
休日スタイルの適用

休日スタイルは、HolidayStyleCollection に登録して初めて有効になります。さらに、このHolidayStyleCollection には、複数の休日スタイルが登録されるので、どの休日スタイルをカレンダーに適用するかも指定する必要があります。

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

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

サンプルコード

C#
コードのコピー
// コレクションに登録します。
gdt.DropDownCalendar.HolidayStyles.Add("個人の休日", aHS);
// カレンダーに反映させます。
gdt.DropDownCalendar.ActiveHolidayStyles = new string[] {"個人の休日"};
Visual Basic
コードのコピー
' コレクションに登録します。
gdt.DropDownCalendar.HolidayStyles.Add("個人の休日", aHS)
' カレンダーに反映させます。
gdt.DropDownCalendar.ActiveHolidayStyles = New string() {"個人の休日"}
臨時の休日と営業日

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

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

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

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

サンプルコード

C#
コードのコピー
using InputManCell = GrapeCity.Win.Spread.InputMan.CellType;

// 2012年10月1日を臨時営業日(仕事)に設定します。
DateTime aDateA = DateTime.Parse("2012/10/1");
gdt.DropDownCalendar.HolidayStyles["個人の休日"].Holidays.Add(new InputManCell.ForceWorkday("仕事", aDateA));
// 2012年10月2日を臨時休日(代休)に設定します。
DateTime aDateB = DateTime.Parse("2012/10/2");
gdt.DropDownCalendar.HolidayStyles["個人の休日"].Holidays.Add(new InputManCell.ForceHoliday("代休", aDateB));
Visual Basic
コードのコピー
Imports InputManCell = GrapeCity.Win.Spread.InputMan.CellType

' 2012年10月1日を臨時営業日(仕事)に設定します。
Dim aDateA As DateTime = DateTime.Parse("2012/10/1")
gdt.DropDownCalendar.HolidayStyles("個人の休日").Holidays.Add(New InputManCell.ForceWorkday("仕事", aDateA))
' 2012年10月2日を臨時休日(代休)に設定します。
Dim aDateB As DateTime = DateTime.Parse("2012/10/2")
gdt.DropDownCalendar.HolidayStyles("個人の休日").Holidays.Add(New InputManCell.ForceHoliday("代休", aDateB))
振替休日

国民の祝日が日曜日に重なったとき、翌日を休日にするという気が利いたシステムに対応して、ドロップダウンカレンダーには、この振替休日を自動的に設定する機能があります。

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

サンプルコード

C#
コードのコピー
Using InputManCell = GrapeCity.Win.Spread.InputMan.CellType;

aHS.Holidays.Weekdays.Sunday = new InputManCell.DayOfWeekHolidayPolicy(
InputManCell.WeekFlags.All, InputManCell.HolidayOverride.NextWorkDay);
Visual Basic
コードのコピー
Imports InputManCell = GrapeCity.Win.Spread.InputMan.CellType

aHS.Holidays.Weekdays.Sunday = New InputManCell.DayOfWeekHolidayPolicy( _
InputManCell.WeekFlags.All, InputManCell.HolidayOverride.NextWorkDay)

ドロップダウンカレンダーでは、カレンダー上に表示された休日が、休日そのものか振替休日かを示すためにツールチップ機能が用意されています。

カレンダー上の振替休日にマウスカーソルが位置したときに表示するツールチップをOverrideTipText プロパティで設定できます。また、ツールチップを表示するタイミングは、TipInterval プロパティで指定します。

休日の確認

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

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

日付の種類 GetTypeOfDay メソッドの戻り値
営業日 0 - GrapeCity.Win.Spread.InputMan.CellType.DayType.Normal
休日 1 - GrapeCity.Win.Spread.InputMan.CellType.DayType.Holiday
臨時営業日 2 - GrapeCity.Win.Spread.InputMan.CellType.DayType.ForcedWorkday
臨時休日 3 - GrapeCity.Win.Spread.InputMan.CellType.DayType.ForcedHoliday
振替休日 4 - GrapeCity.Win.Spread.InputMan.CellType.DayType.OverriddenHoliday
休業日 5 - GrapeCity.Win.Spread.InputMan.CellType.DayType.DayOfWeekHoliday

以下は、GetTypeOfDay メソッドを使って日付の種類を調べるプログラムの例です。

サンプルコード

C#
コードのコピー
using System.Diagnostics;
using InputManCell = GrapeCity.Win.Spread.InputMan.CellType;

// 対象の日付を設定します。
DateTime aDate = DateTime.Parse("2012/10/01");
// 日付の種類を調べます。
InputManCell.HolidayStyle aHS = gdt.DropDownCalendar.HolidayStyles[gdt.DropDownCalendar.ActiveHolidayStyles[0]];
object dayInCollection;
Debug.WriteLine(aHS.Holidays.GetTypeOfDay(aDate, out dayInCollection).ToString());
// 休日、臨時休日、臨時営業日の場合は、その名称を調べます。
if (dayInCollection != null)
{
  Debug.WriteLine(((InputManCell.IHoliday)dayInCollection).Name);
}
Visual Basic
コードのコピー
Imports InputManCell = GrapeCity.Win.Spread.InputMan.CellType
' 対象の日付を設定します。
Dim aDate As DateTime = DateTime.Parse("2012/10/01")
' 日付の種類を調べます。
Dim aHS As InputManCell.HolidayStyle = gdt.DropDownCalendar.HolidayStyles(gdt.DropDownCalendar.ActiveHolidayStyles(0))
Dim dayInCollection As Object
Debug.WriteLine(aHS.Holidays.GetTypeOfDay(aDate, dayInCollection).ToString())
' 休日、臨時休日、臨時営業日の場合は、その名称を調べます。
If Not IsNothing(dayInCollection) Then
  Debug.WriteLine(CType(dayInCollection, InputManCell.IHoliday).Name)
End If

さらに、IHolidayインタフェースを持つ3つのオブジェクト(HolidayForceHolidayForceWorkday)のIsHoliday メソッドとIsYearly プロパティを調べることで、臨時営業日の内容を判別することができます。

臨時営業日の種類 IsHoliday IsYearly
通常は休日 True + True True + False
通常は臨時休日 True + True False + False
通常は休業日 (False) + True (False) + False

言葉だけをみると、表の中の「通常は臨時休日(臨時休日を臨時営業日に設定する)」は無意味ですが、「臨時休日」には毎年変化する祝日(成人の日、体育の日、春分の日、秋分の日)なども含まれます。そのため、ドロップダウンカレンダー内では意味のある設定になります。

以下は、上の表を使って日付を判別するプログラムの例です。少なくとも1つのHolidayStyleが設定されていることを前提にしています。また、休日、臨時休日、および休業日なども事前に設定しておく必要があります。

サンプルコード

C#
コードのコピー
using InputManCell = GrapeCity.Win.Spread.InputMan.CellType;

// チェック用の変数
int checkValue = 0;
// 対象の日付を設定します。
DateTime aDate = DateTime.Parse("2012/10/01");
// 各オブジェクトのIsHoliday メソッドがTrueを返したときに、
// IsYearlyプロパティを調べます。
InputManCell.HolidayStyle aHS = gdt.DropDownCalendar.HolidayStyles[gdt.DropDownCalendar.ActiveHolidayStyles[0]];
foreach (InputManCell.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;
}
Visual Basic
コードのコピー
Imports InputManCell = GrapeCity.Win.Spread.InputMan.CellType
' チェック用の変数
Dim checkValue As Integer = 0
' 対象の日付を設定します。
Dim aDate As DateTime = DateTime.Parse("2012/10/01")
' 各オブジェクトのIsHoliday メソッドがTrueを返したときに、
' IsYearlyプロパティを調べます。
Dim aHS As InputManCell.HolidayStyle = gdt.DropDownCalendar.HolidayStyles(gdt.DropDownCalendar.ActiveHolidayStyles(0))
Dim item As InputManCell.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
関連トピック

 

 


© 2004-2017, GrapeCity inc. All rights reserved.