VisualStudip(C#)で、DateTimePickerをそのまま使うと、nullを入れられません。
なので、常に何かの値が入っているのですが、それは仕方がないとして、せめて非表示にしたい場合に次のようにします。
まず、フォームにDateTimePicker、dateTimePicker1を配置しているとします。
DateTimePickerのvalueには、Nullが入らないので、代わりにDateTime? dateTime を値の入れ物として用意します。DateTime型もNull非許容型なので、?をつけてNull許容型にします。
dateTimePicker.Format の値を DateTimePickerFormat.Customにして、CustomFormat に半角の空白を入れると、日付が非表示になるので、これを利用します。
カレンダーで日付が設定されるなど数値が変更になったときには、イベントを発動して日付を表示させます。
そして、Deleteキーが押された時はdateTime変数をnullにして、DateTimePickerの数値を非表示にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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 < 0 || e.Y > dateTimePicker1.Height) { //[↓]キーを送信して、カレンダーをプルダウンさせる SendKeys.SendWait("%{DOWN}"); } } |
こんな感じで。ちゃんと日付が非表示になりますし、日付を設定すれば、表示されます。
追記:
カレンダー表示が意図せず消えてしまう
表示されたカレンダーの◀や▶をクリックすると、ValueChanged イベントのお陰で、dateTimePicker1_ValueChanged が動いてしまい、カレンダーダイアログが閉じられてしまうので、無理やりですが、dateTimePicker1_MouseDown のところで、マウスが押されたイベントを受け取ったときに、DateTimePikerの領域外であれば、消えてしまったカレンダーダイアログをもう一度表示させるようにします。
DateTimePickerには、プログラムからカレンダーダイアログをドロップダウンする方法がないそうで、代わりにカーソルキーの↓を送信することにします。
参考:http://www.atmarkit.co.jp/fdotnet/dotnettips/893dtpickercal/dtpickercal.htm