Categories: C#

C# DateTimePickerの値を非表示にする。

VisualStudip(C#)で、DateTimePickerをそのまま使うと、nullを入れられません。

なので、常に何かの値が入っているのですが、それは仕方がないとして、せめて非表示にしたい場合に次のようにします。

まず、フォームにDateTimePicker、dateTimePicker1を配置しているとします。

DateTimePickerのvalueには、Nullが入らないので、代わりにDateTime? dateTime を値の入れ物として用意します。DateTime型もNull非許容型なので、?をつけてNull許容型にします。

dateTimePicker.Format の値を DateTimePickerFormat.Customにして、CustomFormat に半角の空白を入れると、日付が非表示になるので、これを利用します。

カレンダーで日付が設定されるなど数値が変更になったときには、イベントを発動して日付を表示させます。
そして、Deleteキーが押された時はdateTime変数をnullにして、DateTimePickerの数値を非表示にします。

DateTime? dateTime;

private void Form1_Load(object sender, EventArgs e)
{
 //イベントの追加
 this.dateTimePicker1.ValueChanged += new System.EventHandler(this.dateTimePicker1_ValueChanged);
 this.dateTimePicker1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dateTimePicker1_KeyDown);
 this.dateTimePicker1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dateTimePicker1_MouseDown);

 //今日の日付を設定した場合
 //dateTime = DateTime.Today;
 //setDateTimePicker(dateTime);

 //nullを設定した場合
 dateTime = null;
 setDateTimePicker(dateTime);
}

private void dateTimePicker1_KeyDown(object sender, KeyEventArgs e)
{
 if (e.KeyData == Keys.Delete)
 {
 //Deleteキーが押されたら、dateTimeにnullを設定してdateTimePicker1を非表示に
 dateTime = null;
 setDateTimePicker(dateTime);
 }
}

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
 //dateTimePicker1の値が変更されたら表示する
 dateTime = dateTimePicker1.Value;
 setDateTimePicker(dateTime);
}

private void setDateTimePicker(DateTime? datetime)
{
 if (datetime == null)
 {
 //DateTimePickerFormat.Custom にして、CostomFormatは半角の空白を入れておくと、日時が非表示になる。
 dateTimePicker1.Format = DateTimePickerFormat.Custom;
 dateTimePicker1.CustomFormat = " ";
 }
 else
 {
 //フォーマットを元に戻して、値をセットする。
 dateTimePicker1.Format = DateTimePickerFormat.Long;
 dateTimePicker1.Value = (DateTime)datetime;
 }
}

//カレンダーの◀や▶をクリックすると消えてしまうカレンダーダイアログをもう一度表示させる
private void dateTimePicker1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Y  dateTimePicker1.Height)
    {
        //[↓]キーを送信して、カレンダーをプルダウンさせる
        SendKeys.SendWait("%{DOWN}"); 
    }
}

こんな感じで。ちゃんと日付が非表示になりますし、日付を設定すれば、表示されます。

 

追記:

カレンダー表示が意図せず消えてしまう

表示されたカレンダーの◀や▶をクリックすると、ValueChanged イベントのお陰で、dateTimePicker1_ValueChanged が動いてしまい、カレンダーダイアログが閉じられてしまうので、無理やりですが、dateTimePicker1_MouseDown のところで、マウスが押されたイベントを受け取ったときに、DateTimePikerの領域外であれば、消えてしまったカレンダーダイアログをもう一度表示させるようにします。

DateTimePickerには、プログラムからカレンダーダイアログをドロップダウンする方法がないそうで、代わりにカーソルキーの↓を送信することにします。

参考:http://www.atmarkit.co.jp/fdotnet/dotnettips/893dtpickercal/dtpickercal.htm

nakaike