SHOEISHA iD

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

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

ComponentZine(CalendarGrid)(AD)

CalendarGrid for Windows Formsで、カレンダー機能のデータをプログラムから扱う

CalendarGrid for Windows Formsを活用したWindowsフォームアプリケーションの作成

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

ガントチャート風のバーの追加

 CalendarGridは、予定が複数日にまたがる場合などにガントチャート表現で表すことができます。

ガントチャート表示
ガントチャート表示

 上記画像のようにバーを表示し、複数日にまたがる場合はバーを期間分表示するようにプログラムを変更します。

CalendarDataクラスの変更

 CalendarDataクラスに以下のように期間を表すプロパティを追加します。

CalendarDataに期間を表すプロパティを追加
/// <summary>
/// カレンダーの一日に対応するクラス
/// </summary>
public class CalendarData
{
    /// <summary>
    /// 日付
    /// </summary>
    public DateTime date { set; get; }

    /// <summary>
    /// タイトル
    /// </summary>
    public string title { set; get; }

    /// <summary>
    /// 概要
    /// </summary>
    public string description { set; get; }

    /// <summary>
    /// 予定の期間
    /// </summary>
    public int span { set; get; }
}

予定の追加

 予定として3日間にまたがる「出張」を追加します。

セルのタイプを変更する
BindingList<CalendarData> dataList = new BindingList<CalendarData>();
dataList.Add(new CalendarData() { date = new DateTime(2016, 1, 1), title = "初詣", description = "神社に行ってお参りをする。", span = 1 });
dataList.Add(new CalendarData() { date = new DateTime(2016, 1, 4), title = "仕事はじめ", description = "朝10時に出社", span = 1 });
dataList.Add(new CalendarData() { date = new DateTime(2016, 1, 6), title = "出張", description = "香港に出張", span = 3 });

 最後の行の「出張」だけ、spanプロパティに3の値を設定しています。

セルのタイプを変更する

 タイトルを表示していたセルをガントチャートのバーが表示できるAppointmentCellTypeに変更します。

 この処理はデザイナーを用いて行うこともできますが、ここではプログラムコードから行います。

セルのタイプを変更する
// セルの上から2行目、左から0列目にtitleプロパティの値を表示する
template.Content[1, 0].DataField = "title";

// セルに名前をつける(後で利用するため)
template.Content[1, 0].Name = "Appoint";

// セルのタイプをAppointmentCellTypeに変更する
template.Content[1, 0].CellType = new GrapeCity.Win.CalendarGrid.CalendarAppointmentCellType();

予定の期間をカレンダーに設定する

 最後に、期間をカレンダーに反映させます。ここで先ほど設定したテンプレートのNameの値"Appoint"を利用します。

カレンダーに期間を反映させる
// 期間の設定をする
foreach (var tmpData in dataList)
{
    gcCalendarGrid1[tmpData.date]["Appoint"].ColumnSpan = tmpData.span;
}

 ガントチャートの期間はセルのColumnSpanプロパティを利用して表現します。

 ここまでの全文は以下です。

カレンダーに期間を反映させる
private void Form1_Load(object sender, EventArgs e)
{
    BindingList<CalendarData> dataList = new BindingList<CalendarData>();
    dataList.Add(new CalendarData() { date = new DateTime(2016, 1, 1), title = "初詣", description = "神社に行ってお参りをする。", span = 1 });
    dataList.Add(new CalendarData() { date = new DateTime(2016, 1, 4), title = "仕事はじめ", description = "朝10時に出社", span = 1 });
    dataList.Add(new CalendarData() { date = new DateTime(2016, 1, 6), title = "出張", description = "香港に出張", span = 3 });

    // データソースとCalendarGridの日付を関連付ける
    gcCalendarGrid1.DataSource = dataList;
    gcCalendarGrid1.DateField = "date";

    // テンプレートにリストの項目を紐づける
    var template = gcCalendarGrid1.Template;

    // セルの上から2行目、左から0列目にtitleプロパティの値を表示する
    template.Content[1, 0].DataField = "title";

    // セルに名前をつける(後で利用するため)
    template.Content[1, 0].Name = "Appoint";

    // セルのタイプをAppointmentCellTypeに変更する
    template.Content[1, 0].CellType = new GrapeCity.Win.CalendarGrid.CalendarAppointmentCellType();

    // セルの上から3行目、左から0列目にdescriptionプロパティの値を表示する
    template.Content[2, 0].DataField = "description";

    // descriptionは折り返し表示できるように
    var cellType = new GrapeCity.Win.CalendarGrid.CalendarTextBoxCellType();
    cellType.Multiline = true;
    template.Content[2, 0].CellType = cellType;

    // 期間の設定をする
    foreach (var tmpData in dataList)
    {
        gcCalendarGrid1[tmpData.date]["Appoint"].ColumnSpan = tmpData.span;
    }

    // カレンダーに表示する最初の日付を設定する
    gcCalendarGrid1.FirstDateInView = new DateTime(2016, 1, 1);

    var date = dataList[0].date;

    // 編集の終了を通知
    gcCalendarGrid1.EndEdit();
}

 これで複数日にまたがる予定にバーを表示できます。

 注意したい点は、一つの行ではバーを重ねることができないことです。同日に複数のバーが重なる場合は、その分の行が必要になります。

同日に複数の予定が存在する場合
同日に複数の予定が存在する場合

まとめ

 CalendarGridの優れたデザイナ機能や、プログラムコードによるバインドを紹介しました。これらの機能により、複雑なセル構成のカレンダー画面を容易に作成することができます。また以下に紹介するように公式のドキュメントもわかりやすいため、業務アプリケーションの要求に合わせた機能が実現可能かの判断が行いやすいのも嬉しいポイントです。

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

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

もっと読む

この記事の著者

西村 誠(ニシムラ マコト)

 Microsoft MVP Windows Platform Development。 Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。 ブログ:眠るシーラカンスと水底のプログラマー 著書:基礎から学ぶ Windowsストアアプリ開発

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

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9190 2016/02/03 11:45

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング