主婦と.NETと犬のぶろぐ

奥様 と プログラム と お犬様 の 楽しい日常

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

MonthCalendar(System.Windows.Forms.MonthCalendar)

DateTimePicker はよく使うんだけど、何故か全く使ったことなし。
こんな不具合もあるみたいです。
MonthCalendar で予期せぬ DateChanged イベントが発生する
特別な事をなにもしなくても普通に再現しますね。

■参考文献
MonthCalendar クラス
MonthCalendar コントロール (Windows フォーム)

■実行画像
ちょっと解りにくいですが、太字に設定したところは太字になってます。
MonthCalendar

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

投稿日時 : 2007年2月26日 10:16

Feedback

# tdwLTQdjCdnsokPULq 2012/01/07 4:39 http://www.luckyvitamin.com/c-153-arnica

This article is for professionals..!

タイトル  
名前  
Url
コメント