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