SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(InputMan)

日付入力をカレンダーから行うWPFアプリケーションの作成

PowerTools InputMan for WPF 1.0JのGcDateTimeコントロールを使ったWPFアプリケーションの作成

  • このエントリーをはてなブックマークに追加

取得休暇日数の計算処理

 GcDateTimeコントロールの設定ができたら、取得休暇日数の計算を行う処理を作成します。この計算は簡単で、GcDateTimeコントロールのValueプロパティの値を差し引きするだけです。処理は、「休暇終了日」用のGcDateTimeコントロール「GcDateTime2」の「ValueChanged」イベントハンドラで行います。

 GcDateTimeコントロールのValueプロパティは、DateTime型の値を格納しており、差し引いた値はTimeSpan型で取得し、Daysプロパティの値を取得して、TextBlockコントロールで表示します。

Visual Basic
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
C#
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メソッドで消去しておきます。

Visual Basic
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})

    '--------------------------------------------------------------------------
C#
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
Visual Basic
    ' 入力フィールドの設定
    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
C#
    // 入力フィールドの設定
    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ケタ表示のどちらで行うかを指定します。

年号の2ケタ/4ケタ表示の指定
メンバ名 説明
FourDigitYear 0 FourDigitYearモードの範囲は0000~9999
TwoDigitYear 1 TwoDigitYearモードの範囲は00~99
Visual Basic
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
C#
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});
}

 また、西暦、和暦に変換する書式を設定する場合、上記のようにフィールドオブジェクトを作成するという方法以外にも、以下のようにキーワードを使用して作成することも可能です。

キーワードを使用した作成方法(Visual Basic)
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

次のページ
和暦・西暦の切り替え処理

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ComponentZine(InputMan)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6112 2018/03/15 15:50

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング