WinFormsでカレンダーコントロールを使用する

この資料では、Windowsフォームアプリケーションで提供されているカレンダーコントロール(MonthCalendar)の基本的な使い方について解説します。カレンダーコントロールは、ユーザーが簡単に日付を選択できる便利なUI要素です。本資料では、Visual Studioを使用して新しいプロジェクトを作成し、カレンダーコントロールをフォームに追加して設定する手順を、初学者向けにわかりやすく説明します。実際にプロジェクトを動かしながら、日付選択時に発生するイベントの処理方法についても学びます。

1. プロジェクトの作成

1.1 新しいプロジェクトを作成

  • Visual Studioを開き、「新しいプロジェクトの作成」 を選択します。
  • プロジェクトのテンプレートは 「Windows フォーム アプリケーション (.NET Framework)」 を選びます。
  • プロジェクトに名前をつけて「作成」ボタンをクリックします。

2. カレンダーコントロールをフォームに追加

2.1 ツールボックスからカレンダーを選択

  • 「ツールボックス」 から MonthCalendar コントロールを探します。
  • フォームデザインビューにカレンダーコントロールをドラッグ&ドロップします。

3. カレンダーコントロールの設定

3.1 基本プロパティの設定

  • MaxSelectionCount: 選択できる最大日数を指定します(例: 7日)。
  • ShowToday: 今日の日付を表示するかどうかを設定します(デフォルトで表示)。
  • ShowTodayCircle: 今日の日付を強調表示するかを設定します。
  • ShowWeekNumbers: 週番号を表示するかどうかを設定します。

3.2 イベントハンドリングの追加

カレンダーの日付が変更されたときに何かしらの処理を行いたい場合は、DateChanged または DateSelected イベントに処理を追加します。

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
{
    MessageBox.Show($"選択された日付: {e.Start.ToShortDateString()} から {e.End.ToShortDateString()}");
}
  • このコードは、ユーザーが日付を変更したときに、選択された開始日と終了日を表示します。

4. 実行して確認

4.1 プロジェクトの実行

  • F5キーを押してプロジェクトを実行します。
  • カレンダーが表示され、日付を選択すると、選択した日付がメッセージボックスで表示されます。

5. まとめ

  • MonthCalendarコントロールは、日付選択を簡単に実装できる便利なツールです。基本プロパティやイベントハンドラを理解し、適切に使うことで、よりインタラクティブなアプリケーションを作成できます。

サンプル

公式の情報を和訳しています

using System;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : Form
{
    // 月間カレンダーコントロール
    private MonthCalendar monthCalendar1;
    // 日付選択結果を表示するテキストボックス
    private TextBox textBox1;

    public Form1()
    {
        // コントロールの初期化を行うメソッドを呼び出し
        Initialize();
        // 月間カレンダーの設定を行うメソッドを呼び出し
        ConfigureMonthCalendar();
        // イベントハンドラの設定を行うメソッドを呼び出し
        ConfigureEventHandlers();

        InitializeComponents();
    }

    // コントロールの初期化とフォームの設定を行うメソッド
    private void Initialize()
    {
        // テキストボックスの設定
        textBox1 = new TextBox
        {
            BorderStyle = BorderStyle.FixedSingle, // テキストボックスの境界スタイルを設定
            Location = new Point(48, 488), // テキストボックスの位置を設定
            Multiline = true, // テキストボックスを複数行に設定
            ReadOnly = true, // テキストボックスを読み取り専用に設定
            Size = new Size(824, 32) // テキストボックスのサイズを設定
        };

        // 月間カレンダーの設定
        monthCalendar1 = new MonthCalendar
        {
            Location = new Point(47, 16), // カレンダーの位置を設定
            BackColor = SystemColors.Info, // カレンダーの背景色を設定
            ForeColor = Color.FromArgb(192, 0, 192), // カレンダーの日付の前景色を設定
            TitleBackColor = Color.Purple, // カレンダーのタイトル背景色を設定
            TitleForeColor = Color.Yellow, // カレンダーのタイトル前景色を設定
            TrailingForeColor = Color.FromArgb(192, 192, 0), // カレンダーの過去の日付の前景色を設定
            CalendarDimensions = new Size(4, 3), // カレンダーの表示を4列3行の12ヶ月分に設定
            FirstDayOfWeek = Day.Monday, // 週の開始日を月曜日に設定
            MaxDate = new DateTime(2010, 12, 31), // カレンダーに表示できる最大日付を設定
            MinDate = new DateTime(1999, 1, 1), // カレンダーに表示できる最小日付を設定
            MaxSelectionCount = 21, // 同時に選択できる最大日数を21日に設定
            ScrollChange = 1, // カレンダーのナビゲーションで1ヶ月ずつ移動するように設定
            ShowToday = false, // 「今日」のバナーを非表示に設定
            ShowTodayCircle = false, // 「今日」の日付にサークルを表示しない設定
            ShowWeekNumbers = true // 各週の左側に週番号を表示する設定
        };

        // フォームにコントロールを追加し、サイズとタイトルを設定
        Controls.AddRange(new Control[] { textBox1, monthCalendar1 });
        ClientSize = new Size(920, 566); // フォームのサイズを設定
        Text = "Month Calendar Example"; // フォームのタイトルを設定
    }

    // 月間カレンダーの詳細な設定を行うメソッド
    private void ConfigureMonthCalendar()
    {
        // 年ごとに強調表示する日付を設定
        monthCalendar1.AnnuallyBoldedDates = new[]
        {
            new DateTime(2002, 4, 20),
            new DateTime(2002, 4, 28),
            new DateTime(2002, 5, 5),
            new DateTime(2002, 7, 4),
            new DateTime(2002, 12, 15),
            new DateTime(2002, 12, 18)
        };

        // 特定の日付を強調表示する日付を設定
        monthCalendar1.BoldedDates = new[]
        {
            new DateTime(2002, 9, 26)
        };

        // 毎月強調表示する日付を設定
        monthCalendar1.MonthlyBoldedDates = new[]
        {
            new DateTime(2002, 1, 15),
            new DateTime(2002, 1, 30)
        };
    }

    // イベントハンドラの設定を行うメソッド
    private void ConfigureEventHandlers()
    {
        // 日付選択時のイベントハンドラを追加
        monthCalendar1.DateSelected += MonthCalendar1_DateSelected;
        // 日付変更時のイベントハンドラを追加
        monthCalendar1.DateChanged += MonthCalendar1_DateChanged;
    }

    // 日付が選択された時に呼び出されるイベントハンドラ
    private void MonthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
    {
        // 選択された日付範囲をテキストボックスに表示
        UpdateTextBox("Date Selected", e);
    }

    // 日付が変更された時に呼び出されるイベントハンドラ
    private void MonthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
    {
        // 変更された日付範囲をテキストボックスに表示
        UpdateTextBox("Date Changed", e);
    }

    // テキストボックスに日付範囲を表示するためのメソッド
    private void UpdateTextBox(string eventType, DateRangeEventArgs e)
    {
        textBox1.Text = $"{eventType}: Start = {e.Start.ToShortDateString()} : End = {e.End.ToShortDateString()}";
    }
}

解説

このコードは、C#のWindowsフォームアプリケーションでカレンダーとテキストボックスを使用するシンプルなプログラムです。これを使って、ユーザーがカレンダーで日付を選択したり変更したときに、その結果をテキストボックスに表示する方法を学ぶことができます。以下はコードの初学者向けの解説です。

1. 基本的な構成

using ディレクティブ

using System;
using System.Drawing;
using System.Windows.Forms;
  • using ディレクティブは、プログラムで使用する名前空間を指定します。SystemSystem.DrawingSystem.Windows.Formsは、それぞれ基本的な機能、描画に関する機能、そしてWindowsフォームの機能を提供します。

クラスの宣言

public class Form1 : Form
  • Form1クラスFormクラスを継承しています。これは、このクラスがWindowsのウィンドウ(フォーム)として動作することを意味します。Formクラスは、フォームの作成や表示、ユーザーとのやり取りを管理するための基本機能を提供します。

3. Form1のコンストラクタ

public Form1()
{
    Initialize();
    ConfigureMonthCalendar();
    ConfigureEventHandlers();

    InitializeComponents();
}
  • コンストラクタは、Form1クラスのインスタンスが作成されるときに自動的に呼び出されるメソッドです。この中でフォームの初期設定を行います。
  • Initialize(),InitializeComponents()ConfigureMonthCalendar()ConfigureEventHandlers()という4つのメソッドが呼び出されています。これらのメソッドでフォーム内の各要素(コントロール)の設定やイベントの準備が行われます。

4. Initializeメソッド

private void Initialize()
{
    textBox1 = new TextBox
    {
        BorderStyle = BorderStyle.FixedSingle,
        Location = new Point(48, 488),
        Multiline = true,
        ReadOnly = true,
        Size = new Size(824, 32)
    };

    monthCalendar1 = new MonthCalendar
    {
        Location = new Point(47, 16),
        BackColor = SystemColors.Info,
        ForeColor = Color.FromArgb(192, 0, 192),
        TitleBackColor = Color.Purple,
        TitleForeColor = Color.Yellow,
        TrailingForeColor = Color.FromArgb(192, 192, 0),
        CalendarDimensions = new Size(4, 3),
        FirstDayOfWeek = Day.Monday,
        MaxDate = new DateTime(2010, 12, 31),
        MinDate = new DateTime(1999, 1, 1),
        MaxSelectionCount = 21,
        ScrollChange = 1,
        ShowToday = false,
        ShowTodayCircle = false,
        ShowWeekNumbers = true
    };

    Controls.AddRange(new Control[] { textBox1, monthCalendar1 });
    ClientSize = new Size(920, 566);
    Text = "Month Calendar Example";
}
  • Initializeメソッドは、フォームに配置する部品(コントロール)の初期化と設定を行います。
  • textBox1は、日付の選択や変更結果を表示するためのテキストボックスです。このテキストボックスは読み取り専用に設定されており、ユーザーが編集できないようになっています。
  • monthCalendar1は、カレンダーコントロールで、ユーザーが日付を選択したり変更したりできるようにします。カレンダーの色や表示される月数、最大・最小日付などが設定されています。
  • Controls.AddRangeは、テキストボックスとカレンダーをフォームに追加します。
  • ClientSizeは、フォーム全体のサイズを設定し、Textはフォームのタイトルを設定します。

5. ConfigureMonthCalendarメソッド

private void ConfigureMonthCalendar()
{
    monthCalendar1.AnnuallyBoldedDates = new[]
    {
        new DateTime(2002, 4, 20),
        new DateTime(2002, 4, 28),
        new DateTime(2002, 5, 5),
        new DateTime(2002, 7, 4),
        new DateTime(2002, 12, 15),
        new DateTime(2002, 12, 18)
    };

    monthCalendar1.BoldedDates = new[]
    {
        new DateTime(2002, 9, 26)
    };

    monthCalendar1.MonthlyBoldedDates = new[]
    {
        new DateTime(2002, 1, 15),
        new DateTime(2002, 1, 30)
    };
}
  • ConfigureMonthCalendarメソッドでは、特定の日付を強調表示するための設定を行います。
  • AnnuallyBoldedDatesは、毎年強調表示される日付を設定します(例えば、誕生日など)。
  • BoldedDatesは、特定の日付を強調表示します。
  • MonthlyBoldedDatesは、毎月の特定の日付を強調表示します。

6. ConfigureEventHandlersメソッド

private void ConfigureEventHandlers()
{
    monthCalendar1.DateSelected += MonthCalendar1_DateSelected;
    monthCalendar1.DateChanged += MonthCalendar1_DateChanged;
}
  • ConfigureEventHandlersメソッドでは、カレンダーで日付が選択されたり変更されたりしたときに実行されるメソッド(イベントハンドラ)を設定します。
  • DateSelectedは、ユーザーが日付を選択したときに呼び出されるイベントです。
  • DateChangedは、ユーザーがカレンダーの日付を変更したときに呼び出されるイベントです。

7. イベントハンドラ

private void MonthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
{
    UpdateTextBox("Date Selected", e);
}

private void MonthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
{
    UpdateTextBox("Date Changed", e);
}
  • イベントハンドラは、特定のイベントが発生したときに実行されるメソッドです。ここでは、DateSelectedDateChangedという2つのイベントハンドラが定義されています。
  • MonthCalendar1_DateSelectedは、ユーザーがカレンダーで日付を選んだときに呼び出され、選択された日付をテキストボックスに表示します。
  • MonthCalendar1_DateChangedは、ユーザーがカレンダーで日付を変更したときに呼び出され、変更された日付をテキストボックスに表示します。

8. UpdateTextBoxメソッド

private void UpdateTextBox(string eventType, DateRangeEventArgs e)
{
    textBox1.Text = $"{eventType}: Start = {e.Start.ToShortDateString()} : End = {e.End.ToShortDateString()}";
}
  • UpdateTextBoxメソッドは、DateSelectedDateChangedイベントが発生したときに、テキストボックスに選択または変更された日付範囲を表示します。
  • eventTypeには、イベントの種類(選択または変更)が渡され、eには日付範囲が渡されます。
  • Textプロパティを使って、テキストボックスに表示する文字列を設定しています。

まとめ

このプログラムは、カレンダーとテキストボックスを使用して、ユーザーがカレンダーで選択したり変更したりした日付を表示するシンプルなWindowsフォームアプリケーションです。各部分がどのように動作するかを理解することで、C#でのWindowsフォーム開発の基本的な知識を身につけることができます。