ユーザコントロール 2005.NET


VB Tips And Sample(HOME)(VB.NET Sample インデックス)


ユーザコントロールで和暦入力のテキストボックスができないか?
と思い、MaskedTextBoxを使ってやってみた結果。
結果は今一。

手順は、
プロジェクトの作成から「Windowsコントロールライブラリ」を選択し
できたフォーム?にマスクエディットコントロールをコピペ、
後は好きなように書けば出来上がり。
ちなみに2003ではコントロールのテストプロジェクトを新規に追加してデバッグ等をやっていたが
2005ではビルドするとコントロールテストツールが勝手に立ち上がってプロパティーなどいろいろ変えてテストできる。
しかしながら完璧ではなかった!
管理人はPrivate Sub New()を書いて初期化していたがデバッグ時にはOKであった。
が、いざ他のプロジェクトからdll(ユーザコントロールは\〜.dllとして出力される)を参照して追加しようとすると
エラーで追加できなかった。
というわけでLoadイベントに初期化を置き換えた。
他に正解があるような気がするが疲れたのでここまで。
VB6でコントロールを作成してきた方には非常に分かり易くなっていると思う。

和暦変換について。
MaskedTextBoxのデータチェックは和暦に関しては大雑把であった。
昭和64年1月9日は存在しないがエラーにならなかった。
これは一旦西暦に戻して云々すると平成1年1月1日に変換はできた。(@IT感謝)
次に西暦55年12月12日となってしまう問題については既に解決策が公開されており(教えてgoo感謝)
なんとかできた。

問題点。
MaskedTextBoxのPronptCharが半角にしか対応しておらず、
「昭和11年11月11日」と入力するには
「____年__月__日 」と表示される事になる。
つまり入力前と後に文字がずれるので見た目がちょっと悪い。(センターアレンジにする方法もあるが・)
これには解決策はなさそう・・・?

Option Compare Binary
Option Explicit On
Option Strict On


Imports System.Globalization

Public Class inputTextBox

    Public ADdate As String '西暦
    Public Wadate As String '和暦

  

    ''Private Sub New()
    ''    'このメソッドを書くとコンポーネントとしてプロジェクトに追加できない
    ''    ' この呼び出しは、Windows フォーム デザイナで必要です。
    ''    InitializeComponent()
    ''    ' InitializeComponent() 呼び出しの後で初期化を追加します。
    ''End Sub
    Private Sub inputTextBox_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Height = Me.MaskedTextBox.Height

        'これを書かないと「西暦55年12月12日」となってしまう↓ 「教えてgooのコピペ↓」
        Dim myCI As New Globalization.CultureInfo("Ja-jp", True)
        Dim myDTFmtInfo As Globalization.DateTimeFormatInfo = myCI.DateTimeFormat
        Dim jpCal As New JapaneseCalendar
        myDTFmtInfo.Calendar = jpCal
        myCI.DateTimeFormat = myDTFmtInfo
        Application.CurrentCulture = myCI
        'これを書かないと「西暦55年12月12日」となってしまう↓ 「教えてgooのコピペ↑」
    End Sub


    Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    Private Sub MaskedTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MaskedTextBox.KeyPress

        If MaskedTextBox.Mask = "AA90年90月90日" Then

            '入力キーを制限する
            If e.KeyChar = CChar("s") Then
                Me.MaskedTextBox.Text = "昭和"
            ElseIf e.KeyChar = CChar("t") Then
                Me.MaskedTextBox.Text = "大正"
            ElseIf e.KeyChar = CChar("m") Then
                Me.MaskedTextBox.Text = "明治"
            ElseIf e.KeyChar = CChar("h") Then
                Me.MaskedTextBox.Text = "平成"
            End If

            If (e.KeyChar < "0"c Or e.KeyChar > "9"c) Or _
                     e.KeyChar <> CChar("s") Or _
                     e.KeyChar <> CChar("t") Or _
                     e.KeyChar <> CChar("m") Or _
                     e.KeyChar <> CChar("h") Then
                e.Handled = True 'MaskedTextBoxには効かないみたい 何かオーバライドする必要が?
            End If

        End If
    End Sub


    Private Sub MaskedTextBox_TypeValidationCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.TypeValidationEventArgs) Handles MaskedTextBox.TypeValidationCompleted


        If Not e.IsValidInput Then
            Me.MaskedTextBox.Text = ""
            'e.Cancel = True ’これを有効にするとなんだか動作がおかしい
            Exit Sub
        End If

        Select Case MaskedTextBox.Mask
            Case "AA90年90月90日"
                '和暦
                Debug.Print(Me.MaskedTextBox.Text)

                '正確な和暦に戻す'これで戻るみたい
                '@ITを参考に↓
                Dim culture As CultureInfo = New CultureInfo("ja-JP", True)
                culture.DateTimeFormat.Calendar = New JapaneseCalendar()

                Dim target As String = Me.MaskedTextBox.Text
                Dim result As DateTime = DateTime.ParseExact(target, "ggyy年M月d日", culture)
                Debug.Print(result.Year.ToString)
                Debug.Print(result.ToLongDateString())
                '@ITを参考に↑
                '西暦を取得する
                ADdate = result.Year & "/" & result.Month & "/" & result.Day

                '正確な値を書き戻す
                Me.MaskedTextBox.Text = result.ToString("ggyy年MM月dd日")

                Wadate = result.ToString("ggyy年MM月dd日")
            Case "そのほか"
                'etc
        End Select
    End Sub
 
End Class



VB Tips And Sample(HOME)(VB.NET Sample インデックス)