DateTimePicker はよく使うんだけど、何故か全く使ったことなし。
こんな不具合もあるみたいです。
MonthCalendar で予期せぬ DateChanged イベントが発生する
特別な事をなにもしなくても普通に再現しますね。
■参考文献
MonthCalendar クラス
MonthCalendar コントロール (Windows フォーム)
■実行画像
ちょっと解りにくいですが、太字に設定したところは太字になってます。
Public Class MonthCalendarTest
Private Sub MonthCalendarTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Size = New Size(450, 350)
Dim myCalendar As MonthCalendar = New MonthCalendar()
Me.Controls.Add(myCalendar)
With myCalendar
.Font = New Font("Verdana", 10.0F, GraphicsUnit.Pixel)
.ForeColor = Color.Navy
.TitleBackColor = Color.Navy
.TitleForeColor = Color.LightBlue
' カレンダーに表示しはじめの月の前月の日付や
' カレンダーに表示しおわりの月の翌月の日付の色
.TrailingForeColor = Color.Gray
' 何行何列で表示するか 行数×列数が表示する月数となる
' この場合、3 列 2 行になる
' でも Dock = DockStyle.Fill と一緒に使うとあまり意味なし
.CalendarDimensions = New Size(3, 2)
'' メソッドでの設定
'.SetCalendarDimensions(3, 2)
' 週のはじめを水曜日にする
.FirstDayOfWeek = Day.Wednesday
' 毎月 10 と 15 を太字で表示(年と月が無視される)
.MonthlyBoldedDates = New DateTime() {#2/10/2007#, #2/15/2007#}
' メソッドでの追加
.AddMonthlyBoldedDate(#2/16/2007#)
' 年間でどの日付を太字にするか(年が無視される)
.AnnuallyBoldedDates = New DateTime() {#3/3/2007#}
' メソッドでの追加
.AddAnnuallyBoldedDate(#5/1/2007#)
' 指定した日付を太字にする
.BoldedDates = New DateTime() {#3/1/2007#, #10/10/2007#}
'.BoldedDates(1) = Nothing 'こんな事はしてもだめです。下記 RemoveAllBoldedDates 参照
' メソッドでの追加
.AddBoldedDate(#3/2/2007#)
' 太字の為の再描画
.UpdateBoldedDates()
' スクロールした時、2 ヶ月先へ
.ScrollChange = 2
' カレンダーの下のほうにある、今日の日付を表示するか否か
.ShowToday = True
' 今日に印をつけるか否か
.ShowTodayCircle = True
' 週番号を表示するか否か
.ShowWeekNumbers = True
' ひと月のカレンダーのサイズ(ReadOnly)
Console.WriteLine(.SingleMonthSize)
' '' 以下は削除系
'' AnnuallyBoldedDates 等で設定した日付をクリアする
'.RemoveAllAnnuallyBoldedDates()
'' BoldedDates 等で設定した日付をクリアする
'.RemoveAllBoldedDates()
'' MonthlyBoldedDates 等で設定した日付をクリアする
'.RemoveAllMonthlyBoldedDates()
' 選択可能な日付の範囲
.MinDate = #2/9/2007# ' 2007/2/9 ~
.MaxDate = #4/1/2008# ' 2007/4/1 までを選択可能とする
' Shift キーを押しながら日付の範囲を指定する時、
' 3 日間まで選択可能にする
.MaxSelectionCount = 3
' 2007/3/10 を選択する
.SetDate(#3/10/2007#)
' 2007/3/10 ~ 2007/3/12 を選択する
.SetSelectionRange(#3/10/2007#, #3/12/2007#)
AddHandler .DateChanged, AddressOf DateChanged
AddHandler .DateSelected, AddressOf DateSelected
End With
End Sub
' ユーザーがマウスで明示的に選択した場合と
' カレンダーの上部の矢印で次の月などに移動して、選択月が変わった時にも発生
Private Sub DateChanged(ByVal sender As Object, ByVal e As DateRangeEventArgs)
Console.WriteLine("■DateChanged■")
Me.OutputSelectedDateRange(sender, e)
End Sub
' ユーザーがマウスで明示的に選択した場合のみ発生
Private Sub DateSelected(ByVal sender As Object, ByVal e As DateRangeEventArgs)
Console.WriteLine("★DateSelected★")
Me.OutputSelectedDateRange(sender, e)
End Sub
' 選択されている情報を吐き出す
Private Sub OutputSelectedDateRange(ByVal sender As Object, ByVal e As DateRangeEventArgs)
Dim mc As MonthCalendar = DirectCast(sender, MonthCalendar)
Console.WriteLine("SelectionStart:" & mc.SelectionStart.ToString("yyyy/MM/dd"))
Console.WriteLine("SelectionEnd:" & mc.SelectionEnd.ToString("yyyy/MM/dd"))
Console.WriteLine("SelectionRange.Start:" & mc.SelectionRange.Start.ToString("yyyy/MM/dd"))
Console.WriteLine("SelectionRange.End:" & mc.SelectionRange.End.ToString("yyyy/MM/dd"))
Dim span As TimeSpan = mc.SelectionRange.End - mc.SelectionRange.Start
Console.WriteLine("選択の間隔:" & span.Days.ToString())
Console.WriteLine("DateRangeEventArgs.Start" & e.Start.ToString("yyyy/MM/dd"))
Console.WriteLine("DateRangeEventArgs.End:" & e.End.ToString("yyyy/MM/dd"))
End Sub
End Class