none
MonthCalendar.BoldedDatesでのエラー RRS feed

  • 質問

  • 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年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年5月19日 13:02

すべての返信

  • 日付型を、書式指定することなく文字列として処理するのは避けるべきかと。

    コントロールパネルの地域設定によっては、日付の区切りが "/" ではない環境や、"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年5月19日 13:02
  • 上記の方法で解決しました。

    ありがとうございます。

    念のため、例外の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


    2015年5月20日 1:15