トップ回答者
MonthCalendar.BoldedDatesでのエラー

質問
-
VB2010で開発を行っています。
2015年5月のWindowsUpdateをインストールしたところ、MonthCalendar.BoldedDatesで
"オブジェクトの現在の状態に問題があるため、操作は有効ではありません"
とエラーが起こるようになりました。
調べたところ、KB3023224をアンインストールすれば正常に動作することは確認できました。
VB側の設定の問題なのかWindowsUpdateによる不具合か判断できずに悩んでいます。
よろしくお願いします。
※下記一部コード
Private Sub MonthCalendar1_DateChanged(sender As System.Object, e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
Dim SELCAL As String
SELCAL = Replace(MonthCalendar1.SelectionRange.Start, "/", "")
Dim BoldDates() As Date = {New Date(Int(Mid(SELCAL, 1, 4)), Int(Mid(SELCAL, 5, 2)), Int(Mid(SELCAL, 7, 2)))}
MonthCalendar1.BoldedDates = BoldDates //ここでエラー
MonthCalendar1.UpdateBoldedDates() //ここでエラー
End Sub- 編集済み bscokzw 2015年5月19日 10:15
回答
-
日付型を、書式指定することなく文字列として処理するのは避けるべきかと。
コントロールパネルの地域設定によっては、日付の区切りが "/" ではない環境や、"2015/05/19"ではなく"2015/5/19" 表記の環境がありえます。また、西暦ではなく和暦モードが採用されている場合もあるでしょう。そのような環境においては、提示された Replace と Mid を使ったコードは、期待動作しなくなってしまいます。
SelectionRange.Start を BoldedDates に割り当てることが目的なのであれば、特に文字列処理せずとも、これで良さそうな気がします。
MonthCalendar1.BoldedDates = New Date() {MonthCalendar1.SelectionRange.Start.Date}
"オブジェクトの現在の状態に問題があるため、操作は有効ではありません"
手元の KB2023224 入り環境で再現しないため、上記の解決策は分からないのですが、「DataChanged イベントの発生時」に設定すると問題が出るのであれば、「DateChanged イベントの発生後」に処理させてみては如何でしょうか。
Public Class Form1 Private SelDate As Date Private Sub MonthCalendar1_DateChanged(sender As Object, e As DateRangeEventArgs) Handles MonthCalendar1.DateChanged Me.SelDate = MonthCalendar1.SelectionRange.Start.Date AddHandler Application.Idle, AddressOf SetBoldDate End Sub Private Sub SetBoldDate(sender As Object, e As EventArgs) RemoveHandler Application.Idle, AddressOf SetBoldDate MonthCalendar1.BoldedDates = New Date() {SelDate} MonthCalendar1.UpdateBoldedDates() End Sub End Class
もし可能であれば、エラー発生時に例外の StackTrace の内容を確認することは出来ますか?
- 回答としてマーク bscokzw 2015年5月20日 0:50
すべての返信
-
日付型を、書式指定することなく文字列として処理するのは避けるべきかと。
コントロールパネルの地域設定によっては、日付の区切りが "/" ではない環境や、"2015/05/19"ではなく"2015/5/19" 表記の環境がありえます。また、西暦ではなく和暦モードが採用されている場合もあるでしょう。そのような環境においては、提示された Replace と Mid を使ったコードは、期待動作しなくなってしまいます。
SelectionRange.Start を BoldedDates に割り当てることが目的なのであれば、特に文字列処理せずとも、これで良さそうな気がします。
MonthCalendar1.BoldedDates = New Date() {MonthCalendar1.SelectionRange.Start.Date}
"オブジェクトの現在の状態に問題があるため、操作は有効ではありません"
手元の KB2023224 入り環境で再現しないため、上記の解決策は分からないのですが、「DataChanged イベントの発生時」に設定すると問題が出るのであれば、「DateChanged イベントの発生後」に処理させてみては如何でしょうか。
Public Class Form1 Private SelDate As Date Private Sub MonthCalendar1_DateChanged(sender As Object, e As DateRangeEventArgs) Handles MonthCalendar1.DateChanged Me.SelDate = MonthCalendar1.SelectionRange.Start.Date AddHandler Application.Idle, AddressOf SetBoldDate End Sub Private Sub SetBoldDate(sender As Object, e As EventArgs) RemoveHandler Application.Idle, AddressOf SetBoldDate MonthCalendar1.BoldedDates = New Date() {SelDate} MonthCalendar1.UpdateBoldedDates() End Sub End Class
もし可能であれば、エラー発生時に例外の StackTrace の内容を確認することは出来ますか?
- 回答としてマーク bscokzw 2015年5月20日 0:50
-
上記の方法で解決しました。
ありがとうございます。
念のため、例外のStackTraceのコピーを貼らせて頂きます。
ファイルの場所だけ省略させて頂きました。
場所 System.Windows.Forms.MonthCalendar.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.IntDestroyWindow(HandleRef hWnd)
場所 System.Windows.Forms.UnsafeNativeMethods.DestroyWindow(HandleRef hWnd)
場所 System.Windows.Forms.NativeWindow.DestroyHandle()
場所 System.Windows.Forms.Control.DestroyHandle()
場所 System.Windows.Forms.Control.RecreateHandleCore()
場所 System.Windows.Forms.MonthCalendar.set_BoldedDates(DateTime[] value)
場所 TOTPPRT.CalenderF.MonthCalendar1_DateChanged(Object sender, DateRangeEventArgs e) 場所 省略\CalenderF.vb:行 35