取得休暇日数の計算処理
GcDateTimeコントロールの設定ができたら、取得休暇日数の計算を行う処理を作成します。この計算は簡単で、GcDateTimeコントロールのValueプロパティの値を差し引きするだけです。処理は、「休暇終了日」用のGcDateTimeコントロール「GcDateTime2」の「ValueChanged」イベントハンドラで行います。
GcDateTimeコントロールのValueプロパティは、DateTime型の値を格納しており、差し引いた値はTimeSpan型で取得し、Daysプロパティの値を取得して、TextBlockコントロールで表示します。
Private Sub GcDateTime2_ValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles GcDateTime2.ValueChanged Dim diff As TimeSpan diff = GcDateTime2.Value - GcDateTime1.Value TextBlock1.Text = diff.Days.ToString + "日" End Sub
private void GcDateTime2_ValueChanged(object sender, RoutedEventArgs e) { TimeSpan diff; diff = (TimeSpan)(GcDateTime2.Value - GcDateTime1.Value); TextBlock1.Text = diff.Days.ToString() + "日"; }
和暦・西暦表示の処理
今度は、CheckBoxコントロールを使って、コードから和暦と西暦を切り替える処理を作成します。この処理は、CheckBoxコントロールのChecked・Uncheckedイベントハンドラで行いますが、同じ処理を3つのGcDateTimeコントロールに対して行うので、専用のメソッドを作成して呼び出す形を取ります。
西暦から和暦への変換処理
最初は、西暦から和暦への変換処理を作成します。メソッド名は「wareki_henkan」で、引数に「GcDateTime」型の変数を指定します。また、GcDateTimeコントロールの各フィールドを操作するため、次の2つの名前空間をインポートしておきます。
GrapeCity.Windows.InputMan GrapeCity.Windows.InputMan.Fields
メソッドを作成したら、最初に表示書式の各フィールドを設定します。和暦を設定するには、まずDateEraYearDisplayFieldオブジェクトを作成します。コンストラクタの引数はありません。次に、それぞれ表示書式用のフィールドオブジェクトを作成して、そのオブジェクトを表示順に順番にDateDisplayFieldCollectionコレクションに追加します。各フィールドとクラスの関係は下表のようになります。
各フィールド | クラス |
リテラル文字 | DateLiteralDisplayField |
月表示フィールド | DateMonthDisplayField |
日表示フィールド | DateDayDisplayField |
年号表示フィールド | DateEraDisplayField |
曜日表示フィールド | DateWeekdayDisplayField |
また、文字色・背景色はそれぞれのオブジェクトの「Background」・「Foreground」プロパティを設定します。なお、それそれのフィールドを設定する前に、現在設定されているフィールドの書式をClearメソッドで消去しておきます。
Imports GrapeCity.Windows.InputMan Imports GrapeCity.Windows.InputMan.Fields Private Sub wareki_henkan(ByVal gcname As GcDateTime) '和暦書式の作成 ' 表示フィールドの設定 Dim wareki As New DateEraYearDisplayField() Dim yearLiteral As New DateLiteralDisplayField("年") Dim MonthDisplayField As New DateMonthDisplayField(False) Dim MonthLiteral As New DateLiteralDisplayField("月") Dim DayDisplayField As New DateDayDisplayField(False) Dim DayLiteral As New DateLiteralDisplayField("日") Dim heisei As New DateEraDisplayField() Dim newcolor As New SolidColorBrush(Color.FromRgb(215, 85, 194)) heisei.Background = newcolor heisei.Foreground = Brushes.Cornsilk Dim youbi As New DateWeekdayDisplayField(0) youbi.Foreground = Brushes.Blue Dim maekakko As New DateLiteralDisplayField("(") Dim atokakko As New DateLiteralDisplayField(")") ' 表示フィールドをクリア gcname.DisplayFieldSet.DisplayFields.Clear() ' 作成したフィールドをコレクションに追加し表示書式を設定 gcname.DisplayFieldSet.DisplayFields.AddRange(New DateDisplayField() { _ heisei, wareki, yearLiteral, MonthDisplayField, MonthLiteral, _ DayDisplayField, DayLiteral, maekakko, youbi, atokakko}) '--------------------------------------------------------------------------
using GrapeCity.Windows.InputMan; using GrapeCity.Windows.InputMan.Fields; private void wareki_henkan(GcDateTime gcname) //和暦書式の作成 { // 表示フィールドの設定 DateEraYearDisplayField wareki = new DateEraYearDisplayField(); DateLiteralDisplayField yearLiteral = new DateLiteralDisplayField("年"); DateMonthDisplayField MonthDisplayField = new DateMonthDisplayField(false); DateLiteralDisplayField MonthLiteral = new DateLiteralDisplayField("月"); DateDayDisplayField DayDisplayField = new DateDayDisplayField(false); DateLiteralDisplayField DayLiteral = new DateLiteralDisplayField("日"); DateEraDisplayField heisei = new DateEraDisplayField(); SolidColorBrush newcolor = new SolidColorBrush(Color.FromRgb(215, 85, 194)); heisei.Background = newcolor; heisei.Foreground = Brushes.Cornsilk; DateWeekdayDisplayField youbi = new DateWeekdayDisplayField(0); youbi.Foreground = Brushes.Blue; DateLiteralDisplayField maekakko = new DateLiteralDisplayField("("); DateLiteralDisplayField atokakko = new DateLiteralDisplayField(")"); // 表示フィールドをクリア gcname.DisplayFieldSet.DisplayFields.Clear(); // 作成したフィールドをコレクションに追加し表示書式を設定 gcname.DisplayFieldSet.DisplayFields.AddRange(new DateDisplayField[] { heisei, wareki, yearLiteral, MonthDisplayField, MonthLiteral, DayDisplayField, DayLiteral, maekakko, youbi, atokakko}); //--------------------------------------------------------------------------
入力用書式設定も同様で、各フィールドのオブジェクトを作成し、DateFieldCollectionコレクションに表示する順番に設定していきます。入力書式のフィールドとクラスは下表のようになります。
フィールド | クラス |
リテラル文字 | DateLiteralField |
月表示フィールド | DateMonthField |
日表示フィールド | DateDayField |
年号表示フィールド | DateEraField |
' 入力フィールドの設定 Dim ip_heisei As New DateEraField() Dim ip_wareki As New DateEraYearField() Dim ip_year As New DateLiteralField("年") Dim MonthField As New DateMonthField(MonthPattern.Number) Dim ip_MonthLiteral As New DateLiteralField("月") Dim ip_DayLiteral As New DateDayField() Dim ip_Day As New DateLiteralField("日") ' 入力フィールドをクリア gcname.FieldSet.Fields.Clear() ' 作成したフィールドをコレクションに追加し入力書式を設定 gcname.FieldSet.Fields.AddRange(New DateField() { _ ip_heisei, ip_wareki, ip_year, MonthField, _ ip_MonthLiteral, ip_DayLiteral, ip_Day}) End Sub
// 入力フィールドの設定 DateEraField ip_heisei = new DateEraField(); DateEraYearField ip_wareki = new DateEraYearField(); DateLiteralField ip_year = new DateLiteralField("年"); DateMonthField MonthField = new DateMonthField(MonthPattern.Number); DateLiteralField ip_MonthLiteral = new DateLiteralField("月"); DateDayField ip_DayLiteral = new DateDayField(); DateLiteralField ip_Day = new DateLiteralField("日"); // 入力フィールドをクリア gcname.FieldSet.Fields.Clear(); // 作成したフィールドをコレクションに追加し入力書式を設定 gcname.FieldSet.Fields.AddRange(new DateField[] { ip_heisei, ip_wareki, ip_year, MonthField, ip_MonthLiteral, ip_DayLiteral, ip_Day}); }
和暦から西暦への変換処理
今度は、和暦から西暦への変換処理を作成します。メソッド名は「seireki_henkan」で、引数に「GcDateTime」型の変数を指定します。
各フィールドオブジェクトの作成は和暦変換と同じで、西暦を設定するオブジェクトだけが違っています。
フィールド | クラス |
表示用西暦フィールド | DateYearDisplayField |
入力用西暦フィールド | DateYearField |
DateYearDisplayFieldクラスのコンストラクタの引数は、先行ゼロ表示を行うかどうかを指定するもので、falseを設定すると先行ゼロ表示を行いません。また、DateYearFieldクラスのコンストラクタの引数はYearDigitType列挙体のメンバで、年号を2ケタ表示か4ケタ表示のどちらで行うかを指定します。
メンバ名 | 値 | 説明 |
FourDigitYear | 0 | FourDigitYearモードの範囲は0000~9999 |
TwoDigitYear | 1 | TwoDigitYearモードの範囲は00~99 |
Private Sub seireki_henkan(ByVal gcname As GcDateTime) '西暦書式の作成 ' 表示フィールドの設定 Dim seireki As New DateYearDisplayField(False) Dim yearLiteral As New DateLiteralDisplayField("年") Dim MonthDisplayField As New DateMonthDisplayField(False) Dim MonthLiteral As New DateLiteralDisplayField("月") Dim DayDisplayField As New DateDayDisplayField(False) Dim DayLiteral As New DateLiteralDisplayField("日") Dim newcolor As New SolidColorBrush(Color.FromRgb(215, 85, 194)) seireki.Background = newcolor seireki.Foreground = Brushes.Cornsilk Dim youbi As New DateWeekdayDisplayField(0) youbi.Foreground = Brushes.Blue Dim maekakko As New DateLiteralDisplayField("(") Dim atokakko As New DateLiteralDisplayField(")") ' 表示フィールドをクリア gcname.DisplayFieldSet.DisplayFields.Clear() ' 作成したフィールドをコレクションに追加し表示書式を設定 gcname.DisplayFieldSet.DisplayFields.AddRange(New DateDisplayField() { _ seireki, yearLiteral, MonthDisplayField, MonthLiteral, _ DayDisplayField, DayLiteral, maekakko, youbi, atokakko}) '-------------------------------------------------------------------------- ' 入力フィールドの設定 Dim ip_seireki As New DateYearField(YearDigitType.FourDigitYear) Dim ip_year As New DateLiteralField("年") Dim MonthField As New DateMonthField(MonthPattern.Number) Dim ip_MonthLiteral As New DateLiteralField("月") Dim ip_DayLiteral As New DateDayField() Dim ip_Day As New DateLiteralField("日") ' 入力フィールドをクリア gcname.FieldSet.Fields.Clear() ' 作成したフィールドをコレクションに追加し入力書式を設定 gcname.FieldSet.Fields.AddRange(New DateField() { _ ip_seireki, ip_year, MonthField, _ ip_MonthLiteral, ip_DayLiteral, ip_Day}) End Sub
private void seireki_henkan(GcDateTime gcname) //和暦書式の作成 { // 表示フィールドの設定 DateYearDisplayField seireki = new DateYearDisplayField(false); DateLiteralDisplayField yearLiteral = new DateLiteralDisplayField("年"); DateMonthDisplayField MonthDisplayField = new DateMonthDisplayField(false); DateLiteralDisplayField MonthLiteral = new DateLiteralDisplayField("月"); DateDayDisplayField DayDisplayField = new DateDayDisplayField(false); DateLiteralDisplayField DayLiteral = new DateLiteralDisplayField("日"); SolidColorBrush newcolor = new SolidColorBrush(Color.FromRgb(215, 85, 194)); seireki.Background = newcolor; seireki.Foreground = Brushes.Cornsilk; DateWeekdayDisplayField youbi = new DateWeekdayDisplayField(0); youbi.Foreground = Brushes.Blue; DateLiteralDisplayField maekakko = new DateLiteralDisplayField("("); DateLiteralDisplayField atokakko = new DateLiteralDisplayField(")"); // 表示フィールドをクリア gcname.DisplayFieldSet.DisplayFields.Clear(); // 作成したフィールドをコレクションに追加し表示書式を設定 gcname.DisplayFieldSet.DisplayFields.AddRange(new DateDisplayField[] { seireki, yearLiteral, MonthDisplayField, MonthLiteral, DayDisplayField, DayLiteral, maekakko, youbi, atokakko}); //-------------------------------------------------------------------------- // 入力フィールドの設定 DateYearField ip_seireki = new DateYearField(YearDigitType.FourDigitYear); DateLiteralField ip_year = new DateLiteralField("年"); DateMonthField MonthField = new DateMonthField(MonthPattern.Number); DateLiteralField ip_MonthLiteral = new DateLiteralField("月"); DateDayField ip_DayLiteral = new DateDayField(); DateLiteralField ip_Day = new DateLiteralField("日"); // 入力フィールドをクリア gcname.FieldSet.Fields.Clear(); // 作成したフィールドをコレクションに追加し入力書式を設定 gcname.FieldSet.Fields.AddRange(new DateField[] { ip_seireki, ip_year, MonthField, ip_MonthLiteral, ip_DayLiteral, ip_Day}); }
また、西暦、和暦に変換する書式を設定する場合、上記のようにフィールドオブジェクトを作成するという方法以外にも、以下のようにキーワードを使用して作成することも可能です。
Private Sub wareki_henkan(ByVal gcname As GcDateTime) ' 表示フィールドの設定 gcname.DisplayFieldSet.DisplayFields.Clear() gcname.DisplayFieldSet.DisplayFields.AddRange("ggg e年MM月dd日") ' 年号フィールドの色を設定 gcname.DisplayFieldSet.DisplayFields(0).Foreground = Brushes.Cornsilk Dim newcolor As New SolidColorBrush(Color.FromRgb(215, 85, 194)) gcname.DisplayFieldSet.DisplayFields(0).Background = newcolor '-------------------------------------------------------------------------- ' 入力フィールドの設定 gcname.FieldSet.Fields.Clear() gcname.FieldSet.Fields.AddRange("ggg e年MM月dd日") End Sub