【C#】【Form】DateTimePicker / MonthCalendar [1] ~ 基本編 ~

■ MonthCalendar

 * カレンダー・コントロール
 * DateTimePicker があれば、そんなに使うことはなさそう

参考資料

http://www.atmarkit.co.jp/fdotnet/dotnettips/627calendardim/calendardim.html

■ DateTimePicker

主なプロパティ

ShowCheckBoxプロパティ
 * チェックボックスで操作の有効/無効を切り替える
Checkedプロパティ
 * チェックボックスのOn/Offを切り替える
http://hiros-dot.net/VBNET2005/Control/DateTimePicker/DateTimePicker03.htm
Format プロパティ
 * 「時間表示」「日付表示」などを切り替える
http://www.labasp.net/CsharpNote/mControl/DateTimePicker/101_110.html#101
http://blogs.wankuma.com/ogiogi/archive/2006/05/20/25322.aspx
http://hiros-dot.net/VBNET2005/Control/DateTimePicker/DateTimePicker02.htm

使用上の注意

【1】 DateTimePickerのMax値は9999/12/31ではない
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datetimepicker.maxdatetime.aspx
より、抜粋
~~~
日付の最大値は 12/31/9998 23:59:59 に設定されます。
~~~

なぜか「9998年」であることに注意。
設計段階などで、どうするかを考えた方がいい。

【2】空表示(null許容)ができない
 * DateTimePickerコントロールにはnull値を入力できない
対応策
 => DateTimePickerを継承し、独自で実装
対応案・その1
 + 日付が有効な場合:チェックボックスがオンで日付が表示
 + DBNull.Valueがセットされた場合:チェックが外れて日付部分がグレーアウト表示
コメント
 * 簡単に実装できるが、deleteキーを押すと怒られるので、使い勝手はいまいち。
 * これなら、MaskedTextBoxの方が使いやすいと思う。(MaskedTextBoxについては以下を参照のこと)
http://blogs.yahoo.co.jp/dk521123/30258884.html
サンプル
 * 「ShowCheckBox = true」にしておくこと
 * なお、実装は以下を参考にした
http://www.atmarkit.co.jp/fdotnet/dotnettips/702nullpicker/nullpicker.html
using System;
using System.ComponentModel;

namespace Sample
{
    class NullableDateTimePicker : System.Windows.Forms.DateTimePicker
    {
        [Bindable(true), Browsable(false)]
        public new object Value
        {
            get
            {
                if (base.Checked)
                {
                    return base.Value;
                }
                else
                {
                    return null;
                }
            }

            set
            {
                if(value == null || Convert.IsDBNull(value))
                {
                    base.Checked = false;
                    return;
                }

                DateTime datetime;
                if (DateTime.TryParse(value.ToString(), out datetime))
                {
                    base.Value = datetime;
                    base.Checked = true;
                }
                else
                {
                    base.Checked = false;
                }
            }
        }
    }
}
使用方法
 * ツールボックスの[コンポーネント]にある上記クラスを選択し、使用したいFromのデザイン部にドラッグ&ドロップ

private void button13_Click(object sender, EventArgs e)
{
    if (this.nullableDateTimePicker1.Value == null)
    {
        this.label1.Text = "空";
    }
    else
    {
        this.label1.Text = this.nullableDateTimePicker1.Value.ToString();
    }
}
対応案・その2
 →以下の関連記事「DateTimePickerコントロール [2] ~Null値を許容~」を参照。
https://blogs.yahoo.co.jp/dk521123/30254461.html

参考文献

http://www.atmarkit.co.jp/fdotnet/dotnettips/893dtpickercal/dtpickercal.html
バグとその対処法
http://others2.blog.so-net.ne.jp/2012-02-12

関連記事

DateTimePicker [2] ~ Null値を許容 ~

https://blogs.yahoo.co.jp/dk521123/30254461.html