visual studio 2005 が不具合を起こした

デバッグ作業中にブレークポイントを設定してからデバッグを開始したら、ブレークポイントのマークが赤い丸じゃなくて黄色で?マークが付いたものにいきなり変わった。なんぞこれ?とは思ったけど、特に気にせずにデバッグ作業をやってみるとブレークポイントに引っかからない。その?マークがついた黄色い丸のブレークポイントの変わりに現れたものにマウスカーソルをのっけてみると、

ブレークポイントは現在の設定ではヒットしません。ソースコードが元のバージョンと異なります。

という風に怒られる。いきなりそんなこと言われても全然思い当たる節がない。とはいってもデバッグできないと困るのでエラー内容に書いてある解決方法の、ツールのオプションからデバッグを選択して、その全般の”元のバージョンと完全に一致するソースファイルを必要とする”のチェックをはずすということを設定した。これで、ブレークポイントで止まるようになった。が、しかし、デバッグの止まり方がおかしい・・・。ステップインで一行ずつ処理を追いかけてみると、if文の分岐でその中身を全部通過している。っていうか分岐していない。そういえばいつものvisual studioのエディタの見た目もなんかおかしい。(ブロックの始まりの一文がなんか背景がグレーっぽい色になってるし)

と、色々焦りまくって試行錯誤した結果私が発見した強引な対処法。

  1. デバッグでステップインの進行が怪しい関数をひとまず切り取る。
  2. すると、コンソールにエラーがズラーっと表示される。宣言がされてないとかメンバーじゃないとかめちゃくちゃ怒られる。
  3. めいいっぱい怒られた後で、切り取った関数をもとにあった場所へ貼り付ける。

このようなことをやってみたら、私の環境では直りました。同じような現象になっている人はやってみると直るかもしれません。

西暦の日付を和暦の日付に変換してみる

2008/03/15

というような西暦の日付を、

平成20年3月15日(土)

といような形式でデータが欲しいので挑戦してみた。他のサイトを見てみるとformat関数で西暦から和暦に変換というのが検索エンジンで沢山でてきたので簡単にできるだろうとタカをくくっていたら、いや、できないんだけど・・・。Format(Now,”gggyy年MM月”)で一発変換というようなことをどこのサイトを見ても書いているので真似してやってみたら西暦08年とかわけのわからない数字を返してくれてどっと疲れた。仕方がないので地道に変換をしてみることにする。

とりあえず手がかりとして見つかったのはJapaneseCalendarクラスgetEraメソッド(ゲッテラメソッド)を使うと元号のようなものを取得できるらしいとのこと。System.Globalization.JapaneseCalendar をimportsすると使えるようになる模様。2008を平成20年という形式でデータが欲しいため、下記のgetGengoYear関数を作成してみた。date型のパラメータを渡して呼ぶと文字列型の元号プラス年で返してくれる。

元号を返してくれる関数:getGengoYear関数

    Private Function getGengoYear(ByVal targetDate As Date) As String

        'これに元号を入れる
        Dim gengo As String

        'これに和暦の年を入れる
        Dim targetGengoYear As String

        'JapaneseCalendarクラスのインスタンス化
        Dim jpCal As Globalization.JapaneseCalendar = New Globalization.JapaneseCalendar

        'パラメータの日付から元号を判断する
        Select Case jpCal.GetEra(targetDate)
            Case 1
                gengo = "明治"
            Case 2
                gengo = "大正"
            Case 3
                gengo = "昭和"
            Case Else
                gengo = "平成"
        End Select

        '元号と和暦の年とをくっつける
        targetGengoYear = gengo & jpCal.GetYear(targetDate) & "年"

        '出来上がった元号プラス和暦年を返す
        Return targetGengoYear

    End Function

これで難関の元号を取得することができた。次は3月15日(土)の部分。さっき作ったgetGengoYear関数と組み合わせて下記のようなgetJapaneseDate関数というものを作ってみた。date型のパラメータを渡してあげると、平成20年3月15日(土)という形式で返してくれる。

和暦を返してくれる関数:getJapaneseDate関数

    private Function getJapaneseDate(ByVal targetDate As Date) As String

        'これに和暦を入れる
        Dim japaneseDate As String

        'これに元号を格納する
        Dim targetYear As String = getGengoYear(targetDate)

        '曜日の条件分岐。
        If targetDate.DayOfWeek = DayOfWeek.Monday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(月)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Tuesday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(火)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Wednesday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(水)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Thursday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(木)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Friday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(金)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Saturday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(土)"

        Else

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(日)"

        End If

        '出来上がった和暦を返す
        Return japaneseDate

    End Function

サンプルコード

実際に使うときは下記のような感じになる・・・かな。

Imports System.Globalization.JapaneseCalendar

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim todayDate As Date = Today.Date
        MsgBox(getJapaneseDate(todayDate))

    End Sub

    private Function getJapaneseDate(ByVal targetDate As Date) As String

        'これに和暦を入れる
        Dim japaneseDate As String

        'これに元号を格納する
        Dim targetYear As String = getGengoYear(targetDate)

        '曜日の条件分岐。
        If targetDate.DayOfWeek = DayOfWeek.Monday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(月)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Tuesday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(火)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Wednesday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(水)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Thursday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(木)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Friday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(金)"

        ElseIf targetDate.DayOfWeek = DayOfWeek.Saturday Then

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(土)"

        Else

            japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(日)"

        End If

        '出来上がった和暦を返す
        Return japaneseDate

    End Function

    Private Function getGengoYear(ByVal targetDate As Date) As String

        'これに元号を入れる
        Dim gengo As String

        'これに和暦の年を入れる
        Dim targetGengoYear As String

        'JapaneseCalendarクラスのインスタンス化
        Dim jpCal As Globalization.JapaneseCalendar = New Globalization.JapaneseCalendar

        'パラメータの日付から元号を判断する
        Select Case jpCal.GetEra(targetDate)
            Case 1
                gengo = "明治"
            Case 2
                gengo = "大正"
            Case 3
                gengo = "昭和"
            Case Else
                gengo = "平成"
        End Select

        '元号と和暦の年とをくっつける
        targetGengoYear = gengo & jpCal.GetYear(targetDate) & "年"

        '出来上がった元号プラス和暦年を返す
        Return targetGengoYear

    End Function

End Class

datagridの列幅の調整ができない

こんなことで嵌るのは私くらいかもしれないけれど一応備忘録

datagridviewのプロパティにある、AllowUserToResizeColumnsの値をtrueに設定しても、実際にデータをバインドしてみたら列幅の調整が効かない場合の原因。原因は、AutoSizeColumnsModeの値でAllCellsを設定していたために調整することが出来なかった模様。まあ、いわゆる機能が競合していたというか、AutoSizeColumnsModeの方が優先されていたためということかな。値はnoneに設定して、コードでcolumnのwidthを設定することに変更した。